Как указать размер точек в легенде размера точек matplotlib - PullRequest
0 голосов
/ 02 апреля 2020

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

Я экспериментирую с использованием legend_elements функция. Я просмотрел demo и документацию, но не похоже, что есть способ сделать то, что я хочу, с помощью этой функции.

Затем я попытался набрать то же количество очков, что и у меня. Причина в том, что я могу выбрать первую, среднюю и последнюю точки, чтобы приблизить минимум, среднее и максимальное. Однако минимальные и максимальные точки, которые показывает легенда, не являются минимальными и максимальными точками в данных. Почему при вызове одного и того же количества легенд о точках в качестве точек выборки не было получено минимальное и максимальное значения? Можно ли использовать вспомогательную функцию, например legend_elements, для создания легенды, показывающей минимальный, средний и максимальный размеры точек на точечной диаграмме?

import matplotlib.pyplot as plt
import numpy as np

# ensure repeatability
np.random.seed(123456)

NSAMPS = 100 # Number of scattered points

idx = [0, NSAMPS // 2, -1] # min-medium-max coordinates

# randomly sample x, y, and size from 0 to 100
RandomMatrix = 100 * np.random.random((NSAMPS, 3))

# make scatter plot
sc = plt.scatter(RandomMatrix[:, 0], RandomMatrix[:, 1], s=RandomMatrix[:, 2])

# recover the same number of element sizes
sizes = sc.legend_elements("sizes", num=NSAMPS)

# parse the sizes for the first, middle, and last entries
args = (list(np.array(sizes[0])[idx]), list(np.array(sizes[1])[idx])) 

# show that the estimated min and max sizes are 1.6 and 98.4, respectively
plt.legend(*args, **{'title': "I want the true min-med-max here! [thanks for taking a look:)]", 'bbox_to_anchor': (1, 1)})

# save figure
plt.savefig('mybigprobelem')

# show that the true minimum and maximum sizes are 1.06 and 98.9
# (I wish for these numbers/sizes to be in the first and third legend positions)
print('True min-max: ', RandomMatrix[:, 2].min(), RandomMatrix[:, 2].max())

enter image description here

True min-max:  1.0692999366311629 98.89493616046823

1 Ответ

1 голос
/ 02 апреля 2020

Заменить args на:

args = (list(np.array(sizes[0])[idx]), np.sort(RandomMatrix[:,2])[idx]) 

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...