2017-02-05 4 views
1

Меня интересует построение легенды в моей диаграмме рассеяния. Мой текущий код выглядит следующим образомmatplotlib chartplot с легендой

x=[1,2,3,4] 
y=[5,6,7,8] 
classes = [2,4,4,2] 
plt.scatter(x, y, c=classes, label=classes) 
plt.legend() 

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

This is how the plot looks

Я понимаю, что это вопрос, который обсуждается ранее в потоках, таких, как этот one, однако я чувствую, что моя проблема еще проще и решение там не соответствует его. Кроме того, в этом примере человек задает цвета, но в моем случае я заранее знаю, сколько цветов мне понадобится. Кроме того, в примере this пользователь создает несколько рассеивателей, каждый из которых имеет уникальный цвет. Опять же, это не то, что я хочу. Моя цель - просто создать график, используя массив x, y и метки. Это возможно?

Спасибо.

ответ

4

Фактически оба связанных вопроса обеспечивают способ достижения желаемого результата.

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

import matplotlib.pyplot as plt 

x=[1,2,3,4] 
y=[5,6,7,8] 
classes = [2,4,4,2] 
unique = list(set(classes)) 
colors = [plt.cm.jet(float(i)/max(unique)) for i in unique] 
for i, u in enumerate(unique): 
    xi = [x[j] for j in range(len(x)) if classes[j] == u] 
    yi = [y[j] for j in range(len(x)) if classes[j] == u] 
    plt.scatter(xi, yi, c=colors[i], label=str(u)) 
plt.legend() 

plt.show() 

enter image description here

+0

Ваш ответ помог мне создать участки, которые я хотел. Благодарю. – user3276768

+1

Я единственный, кто считает это удивительным, что нет никакого способа построить это? Мне кажется, что планирование распределения точек разных классов - очень обычная задача. Пожалуйста, просветите меня, если вы знаете, почему. – Johannes

+0

@Johannes Что именно вы хотели бы иметь «встроенный»? Это о сюжете или легенде? – ImportanceOfBeingErnest

3

Может вручную заполняя table может быть полезным здесь. Другая идея заключается в использовании colorbar, если ваши классы являются непрерывными числами. Я показываю оба подхода в одном.

x=[1,2,3,4,5,6,7] 
y=[1,2,3,4,5,6,7] 
classes = [2,4,4,2,1,3,5] 
cmap = cm.get_cmap("viridis",5) 
plt.scatter(x, y, c=classes, label=classes,cmap=cmap,vmin=0.5,vmax=5.5) 
plt.colorbar() 
unique_classes = list(set(classes)) 
plt.table(cellText=[[x] for x in unique_classes], loc='lower right', 
      colWidths=[0.2],rowColours=cmap(np.array(unique_classes)-1), 
     rowLabels=['label%d'%x for x in unique_classes], 
      colLabels=['classes']) 

enter image description here

+1

Хорошая идея! Только colormapping немного взломан. – ImportanceOfBeingErnest

+1

Да, он нуждается в некоторой настройке и будет применяться только в том случае, если ваши данные имеют все числа в интервале. –

Смежные вопросы