Python: диаграмма рассеяния Matplotlib имеет верхний предел количества возвращаемых дескрипторов (не возвращаются все дескрипторы для правильной печати легенды) - PullRequest
0 голосов
/ 07 августа 2020

Я использую matplotlib для построения диаграммы рассеяния. Мои данные имеют координаты x и y точек, которые я рисую, а также значение "count", которое принимает значения от 1 до 29. Чтобы представить "счетчик" в легенде, я использую 3 различных способа, как указано ниже.

a) Размер точки разброса

б) Цвет точки разброса

c) Отметка X на альтернативном «count»

Так как всего 29 отсчетов, я ожидаю 29 записей в легенде. Однако, похоже, есть ограничение на количество записей легенды - 8. Есть ли способ гарантировать, что я могу показать все 29 записей легенды. Код, который у меня есть, приведен ниже

point = cluster_actual_crashes
# point.geometry gives x and y coordinates 
# point['count'] gives the count value for that data point

scatter = plt.scatter(point.geometry.x, point.geometry.y,
                   edgecolors = 'black',
                   linewidths = 2,
                   c=point['count'],
                   s=100*point['count'].values^2,
                   cmap = 'hsv',#Cyclic colormapshttps://matplotlib.org/3.1.0/tutorials/colors/colormaps.html 
                   alpha = 0.5) 
# point_plus are the points which are marked with 'X'
point_plus = point[point['count'].isin(point['count'].value_counts().index[::2])]
scatter_plus = plt.scatter(point_plus.geometry.x, point_plus.geometry.y,
                           marker = "x",
                           s=80*point_plus['count'].values^2 ) 

# https://matplotlib.org/3.1.1/tutorials/intermediate/legend_guide.html
handles, labels = scatter.legend_elements(prop='sizes')
handles2, _ = scatter.legend_elements(prop='colors')
handles_plus, _ = scatter_plus.legend_elements(prop='sizes')
handles_final = []
for i, handle in enumerate(handles):
    handles[i].set_c(handles2[i].get_c())
    handles[i].set_linewidth(2)
    handles[i].set_markeredgecolor('black')
    if ((i+1)%2 == 1):
        # print(int((i-1)/2))
        handles_final.append((handles[i],handles2[i], handles_plus[int((i-1)/2)]))
    else:
        handles_final.append((handles[i],handles2[i]))
        # handles[i].set_markeredgecolor('red')
labels = [str(i) for i in set(point['count'].values)]
# Add a title to legend with title keyword
plt.legend(handles_final, labels, title='Number of Crashes',
           loc='upper left', bbox_to_anchor=(1.04, 0.25, 0.5, 0.5),
           labelspacing=2,
           borderpad=1.5,
           title_fontsize=titlefontsize*0.9,
           fontsize = titlefontsize*0.9)

Спасибо,

1 Ответ

0 голосов
/ 08 августа 2020

Если c установлен как массив целых чисел, то возможно максимум 15 записей легенды.

c = np.arange(len(15)) + 1

Обратите внимание, что если вы передадите в этот массив любое «внешнее» значение, кроме 1 thru '15 не только значение игнорируется, но и легенда будет содержать не более 8 дескрипторов и меток.

У вас может быть массив длиной больше 15, но каждое значение должно быть в [1 ..15], и только первые 15 значений будут выбраны для создания записи легенды.

Учитывая, что у вас есть 29 точек данных, я бы предложил использовать две легенды. Каждая легенда может использовать цвета от 1 до 15, и каждый набор может использовать свой собственный маркер.

Я пробовал другие цветовые метки (для справки, https://matplotlib.org/3.1.0/gallery/color/named_colors.html и https://matplotlib.org/3.1.0/tutorials/colors/colors.html?highlight=x11%20css4%20xkcd). Хотя это позволяет указать более 15 цветов, во всех случаях мне не удавалось создать легенду.

ПРИМЕЧАНИЕ: Я новичок * от 1028 * до python и matplotlib. Я впервые столкнулся с этой проблемой сегодня, пытаясь пометить 18 точек данных.

Возможно, неразумно иметь более 15 серий на одном графике для UX / читабельности?

Возможно аннотация - правильный ли способ пометить более 15 точек на диаграмме рассеивания?

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