Как визуализировать список строк на цветовой панели в matplotlib - PullRequest
0 голосов
/ 30 октября 2019

У меня есть набор данных, подобный

x = 3,4,6,77,3
y = 8,5,2,5,5
labels = "null","exit","power","smile","null"

Затем я использую

from matplotlib import pyplot as plt
plt.scatter(x,y)
colorbar = plt.colorbar(labels)
plt.show()

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

Как это получить?

1 Ответ

0 голосов
/ 30 октября 2019

Я не уверен, если это хорошая идея сделать это для scatter графиков в целом (у вас одно и то же описание для разных точек данных, может быть, просто использовать легенду здесь?), Но я думаю, конкретное решениек тому, что вы имеете в виду, может быть следующее:

from matplotlib import pyplot as plt

# Data
x = [3, 4, 6, 77, 3]
y = [8, 5, 2, 5, 5]
labels = ('null', 'exit', 'power', 'smile', 'null')

# Customize colormap and scatter plot
cm = plt.cm.get_cmap('hsv')
sc = plt.scatter(x, y, c=range(5), cmap=cm)
cbar = plt.colorbar(sc, ticks=range(5))
cbar.ax.set_yticklabels(labels)
plt.show()

Это приведет к такому выводу:

Output

Код объединяет эту демонстрацию Matplotlib и этот SO-ответ .

Надеюсь, что это поможет!

РЕДАКТИРОВАТЬ: Включение комментариевЯ могу думать только о каком-то цветном словаре меток, генерируя пользовательскую цветовую карту из цветов, и прежде чем строить график, явно выбирая правильные индексы цветов из меток.

Вот обновленный код (я добавил несколько дополнительных цветови точки данных для проверки масштабируемости):

from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np

# Color information; create custom colormap
label_color_dict = {'null': '#FF0000',
                    'exit': '#00FF00',
                    'power': '#0000FF',
                    'smile': '#FF00FF',
                    'addon': '#AAAAAA',
                    'addon2': '#444444'}
all_labels = list(label_color_dict.keys())
all_colors = list(label_color_dict.values())
n_colors = len(all_colors)
cm = LinearSegmentedColormap.from_list('custom_colormap', all_colors, N=n_colors)

# Data
x = [3, 4, 6, 77, 3, 10, 40]
y = [8, 5, 2, 5, 5, 4, 7]
labels = ('null', 'exit', 'power', 'smile', 'null', 'addon', 'addon2')

# Get indices from color list for given labels
color_idx = [all_colors.index(label_color_dict[label]) for label in labels]

# Customize colorbar and plot
sc = plt.scatter(x, y, c=color_idx, cmap=cm)
c_ticks = np.arange(n_colors) * (n_colors / (n_colors + 1)) + (2 / n_colors)
cbar = plt.colorbar(sc, ticks=c_ticks)
cbar.ax.set_yticklabels(all_labels)
plt.show()

И новый вывод:

New output

Нахождение правильной средней точкикаждый цветовой сегмент (все еще) не хорош, но я оставлю этот оптимизированныйдействия для вас.

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