2014-01-21 4 views
1

Я хочу построить сетку, где каждый узел в сетке нарисован точкой, с определенным цветовым кодом (взятым из вектора, хранящегося в узле).Поиск правильного размера маркера для графика рассеяния

my grid

сетка здесь изменяется в размере в зависимости от размера симуляции я бегу. Мне еще предстоит выяснить взаимосвязь между размером холста и размером маркера. Теперь я использую следующую формулу:

markersize = (figsize*figsize*dpi*dpi)/(xdim*ydim) 
plt.scatter(X, Y, s=markersize/3, marker='s', c=Z, cmap=cm.rainbow) 
plt.show() 

, которое я квадратуры sigsize и точек на дюйм (использование 15 и 80 соответственно), и разделить размерностью сетки. Наконец, я разделил это на 3, поскольку нашел, что это работает.

Но я не смог определить, как аналитически получить правильный размер маркера. То, что я хочу, это сетка, в которой каждый квадрат использует столько пространства, сколько может, но без «infringinig» в пространстве других узлов, так что маркеры перекрываются.

Насколько я могу прочесть, фигура дана в дюймах. dpi - точки на дюйм, а маркеры - в точках. Если точки совпадают с точками, тогда вы должны будете иметь dpi фиксировать количество точек на каждой оси. Xdim ydim - количество узлов в моей сетке. Разделение pow (dpi figsize, 2)/xdim ydim затем должен указывать количество точек на узел и правильный размер для каждого маркера, который я думал. Но это сделало маркеры слишком большими. Я нырнул на 3, и это вроде как работало практически для размеров, которые я обычно запускаю, но не для всех. (Я угадываю точку, а точка не то же самое, но каково отношение?)

Как я правильно сформулировал ответ? В идеале я хотел бы получить очень гранулированную картинку, где я мог бы увеличить определенные области, чтобы получить более тонкий взгляд на цветные нюансы.

+0

Хорошо, если у вас есть изотропные данные, где fig_size_x = fig_size_y вы можете сделать это: 'marker_size = fig_x * fig_dpi/xdim. ax.scatter (x, y, z, marker = 's', c = areaImg [x, y, z], s = marker_size, zdir = 'z', cmap = plt.cm.rainbow) '. Затем, чтобы получить четкую структуру, вы можете играть с [интерполяцией] (http://matplotlib.org/examples/images_contours_and_fields/interpolation_methods.html) – bazilevs31

ответ

0

Если вы хотите точно контролировать размер маркера и иметь масштаб с фигурой, вы можете использовать patch вместо обычного маркера. Вот пример:

from matplotlib import pyplot as plt 
from matplotlib.patches import Circle 

x = [1, 2, 3, 4, 5] 
y = [1, 3, 1, 2, 4] 
colors = [10, 215, 30, 100] 

cmap = plt.cm.jet 
fig = plt.figure() 
ax = fig.add_subplot(111, aspect='equal') 

for (x, y, c) in zip(x, y, colors): 
    ax.add_artist(Circle(xy=(x, y), radius=0.5, color=cmap(c)))  

ax.set_xlim(0, 6) 
ax.set_ylim(0, 6) 
plt.show() 

Вы также можете использовать прямоугольник вместо круга.

+0

спасибо за это предложение. но я думаю, что повторение всех этих пунктов будет слишком медленным для меня. есть ли способ выполнить точный расчет размера маркера для графика рассеяния? – user1603472

Смежные вопросы