2016-04-06 30 views
1

Я получаю отчаяние об этом, я пока не нашел ничего на www.Площадь разброса python Площадь Площадь пропорциональная ось

Вот ситуация:

  • Я работаю с Python.
  • У меня есть 3 массива: x-координаты, y-координаты и радиус.
  • Я хочу создать график рассеяния с заданными x- и y-координатами.

До сих пор все работает, как я хочу. Вот что меня беспокоит:

  • Размер круга каждой точки на участке рассеяния должен определяться массивом радиуса.
  • Значения координат и радиуса находятся в одинаковых единицах. Явным образом: предположим, что у меня есть точка в (1, 1) с назначенным радиусом 0,5. Затем я хочу получить круг на графике с центром в (1, 1) и с границей, проходящей через точки (1,5, 1), (1, 1,5), (0,5, 1) и (1, 0,5)

То, с чем я борюсь, заключается в том, чтобы узнать отношение точек графика к длине оси. Мне нужно работать с точками, потому что, насколько я вижу, размер окружности разброса задается в значениях точки. Так что, если мы скажем, что моя ось идет от 0 до 10, мне нужно знать, сколько точек в промежутке между ними.

Может кто-нибудь мне помочь? Или есть другой способ сделать это? Спасибо заранее.

+0

Это сложная вещь, чтобы сделать в Matplotlib - здесь является хорошей отправной точкой: http://stackoverflow.com/questions/14827650/pyplot-scatter-plot-marker-size –

ответ

0

Я вскакиваю с другого stackoverflow question. Я думаю, что такой подход вы представили как answer to the present question не будет работать именно так, как вы хотите, по следующим причинам:

  • Во-первых, размер маркеров в точках, а не в пикселях. В типографии the point является наименьшей единицей измерения и соответствует в matplotlib фиксированной длине 1/72 дюйма. Напротив, размер пикселя будет варьироваться в зависимости от размера dpi и размера.
  • Во-вторых, размер маркеров в plt.scatter связан с диаметром кругов, а не с радиусом.

Таким образом, размер в точках каждого маркера должен быть рассчитан как:

size_in_points = (2 * radius_in_pixels/fig_dpi * 72 points/inch)**2

Кроме того, как показано в приведенной ниже MWE, можно вычислить величину радиуса маркера в пикселях непосредственно matplotlib transformations, без создания пустого рисунка заранее:

import numpy as np 
import matplotlib.pyplot as plt 

plt.close('all') 

# Generate some data : 
N = 25 
x = np.random.rand(N) + 0.5 
y = np.random.rand(N) + 0.5 
r = np.random.rand(N)/10 

# Plot the data : 
fig = plt.figure(facecolor='white', figsize=(7, 7)) 
ax = fig.add_subplot(111, aspect='equal') 
ax.grid(True) 
scat = ax.scatter(x, y, s=0, alpha=0.5, clip_on=False) 
ax.axis([0, 2, 0, 2]) 

# Draw figure : 
fig.canvas.draw() 

# Calculate radius in pixels : 
rr_pix = (ax.transData.transform(np.vstack([r, r]).T) - 
      ax.transData.transform(np.vstack([np.zeros(N), np.zeros(N)]).T)) 
rpix, _ = rr_pix.T 

# Calculate and update size in points: 
size_pt = (2*rpix/fig.dpi*72)**2 
scat.set_sizes(size_pt) 

# Save and show figure: 
fig.savefig('scatter_size_axes.png') 
plt.show() 

enter image description here

Точка в точке (1, 1) с присвоенным радиусом 0,5 приведет к кругу на графике с центром в (1, 1) и границей, проходящей через точки (1.5, 1), (1, 1.5), (0,5, 1) и (1, 0.5):

enter image description here

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