Легенда / ключ Pyplot, но для масштаба, как на картах

Я делаю точечный график, где размер маркеров задается списком, так что каждый из них отличается. Есть ли какой-нибудь способ добавить ключ, который говорит: "этот размерный круг эквивалентен этому значению" и так далее? Например, как на картах есть ключи, где показано, что, скажем, 1 дюйм равен 1 миле. Если это вообще важно, я делаю это в блокноте Jupyter, но я не думаю, что это должно иметь значение.

Изменить: чтобы уточнить, каждая точка данных является средним значением многих других, а размер каждого маркера соответствует количеству точек данных, использованных для расчета этого среднего. Так, например, одна из меньших точек - это медиана 50 чисел, в то время как один из более крупных маркеров предназначен для точки данных, которая является медианой 150 чисел. Таким образом, числа, которым они соответствуют, также не являются физическими размерами, как карта.

У меня уже есть маркеры, масштабированные так, как я хочу, чтобы они были, а мне нужна легенда / ключ, который указывает, как размер маркера соотносится со значением, из которого он исходит.

2 ответа

Насколько я понимаю, вы хотите, чтобы ваши маркеры были в масштабе. Это невозможно с plt.scatter() так как его размеры всегда в пикселях. Можно использовать исправления и добавить их в коллекцию PatchCollection.

Вот пример

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.collections import PatchCollection 

patches = []
coordinates = [(0,0), (2,0), (5,2), (1,7.6), (6,7), (2,4), (-1,5)]
sizes = 0.9+np.random.rand(len(coordinates),2)*1.99
print sizes

for i, co in enumerate(coordinates):
    rect = mpatches.Rectangle(co, sizes[i,0], sizes[i,1], ec="k")
    patches.append(rect)

fig, ax = plt.subplots(figsize=(6,5))
ax.set_aspect("equal")
colors = np.linspace(0, 1, len(patches))
collection = PatchCollection(patches, cmap=plt.cm.hsv, alpha=0.3)
collection.set_array(np.array(colors))
ax.add_collection(collection)

norm_scale = mpatches.Rectangle((7,-1), 2,2,  ec="k", facecolor="b")
ax.add_patch(norm_scale)
ax.set_xlim([-2,10])
ax.set_ylim([-2,10])
ax.set_ylabel("position [meters]")
ax.set_xlabel("position [meters]")
ax.set_title("Tents on a meddow")
ax.text(8,0.9, "2 m", color="w", ha="center", va="top")
ax.text(7.1,0, "2 m", color="w", ha="left", va="center", rotation=90)
plt.show()

приведение следующего графика, где темно-синий патч является своего рода ключом, показывающим стандартный размер.

Используйте аргумент s (размер в точках ^2) в plt.scatter. Здесь MWE.

import matplotlib.pyplot as plt

value_and_markersize = {value:4**value for value in range(1, 10)}

x = [2, 4, 5, 7]
y = [0]*len(x)
s = [value_and_markersize[value] for value in x]

plt.scatter(x, y, s=s)
plt.show()

который производит,

Другие вопросы по тегам