Цветовая легенда на точечных графиках - не в состоянии понять код - PullRequest
0 голосов
/ 18 марта 2020

Я стремлюсь глубже разбросать графики и пытаюсь понять, как сделать легенду о цветных различиях. Из учебника по net, получая этот фрагмент кода, но не в состоянии понять, что он делает.

# Prepare Data 
 # Create as many colors as there are unique midwest['category'] 
categories = np.unique(midwest['category']) 
colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Целью цветовой карты является сопоставление числа в интервале [0-1] с цветом.

, если рассмотреть цветовую карту tab10, plt.cm.tab10(0.0) вернет цвет в крайнем левом углу край карты цветов, а plt.cm.tab10(1.0) возвращает цвет по правому краю.

enter image description here

Здесь пользователь хочет получить столько цветов, сколько имеется являются категориями (скажем, N), поэтому они генерируют N чисел, равных интервалу в интервале [0-1].

Например, если мы предположим, что categories содержит 4 элемента, то

[i/float(len(categories)-1) for i in range(len(categories))]

возвращает

[0.0, 0.3333333333333333, 0.6666666666666666, 1.0]

, передавая каждое из этих чисел в plt.cm.tab10(), эти числа преобразуются в 4 отдельных цвета

[plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]

возвращает

[(0.12156862745098039, 0.4666666666666667, 0.7058823529411765, 1.0),
 (0.8392156862745098, 0.15294117647058825, 0.1568627450980392, 1.0),
 (0.8901960784313725, 0.4666666666666667, 0.7607843137254902, 1.0),
 (0.09019607843137255, 0.7450980392156863, 0.8117647058823529, 1.0)]

Обратите внимание, что все это можно записать гораздо более компактно, например:

plt.cm.tab10(np.linspace(0,1,len(categories)))

enter image description here

0 голосов
/ 18 марта 2020

В этом коде есть неявное предположение, что количество уникальных категорий равно 10 или меньше, потому что tab10 colormap имеет только 10 цветов. Тем не менее, в этом случае, вероятно, нельзя было бы назвать эту цветовую карту с одинаково распределенными числами с плавающей точкой в ​​диапазоне от 0 до 1, и она также потерпит неудачу, если присутствует только одна категория.

Вместо этого можно выбрать "категориальную" цветовую карту, например tab10, если количество цветов меньше, в противном случае выберите один с большим количеством цветов.

categories = np.unique(data)
if len(categories) <= 10: 
    colors = plt.cm.tab10(np.arange(len(categories)))
else:
    colors = plt.cm.viridis(np.linspace(0, 1, len(categories)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...