2016-10-14 3 views
4
У меня есть этот сюжет, в котором некоторые области между кривыми заполняются по определению. Есть ли способ включить их в легенду? Особенно там, где эти заполненные области перекрываются, а также появляется новый и другой цвет.

Или существует возможность определить произвольную легенду независимо от данных кривых? enter image description hereОпределенная пользователем легенда в python

+1

Посмотрите [на эту тему] (http://stackoverflow.com/questions/13303928/how-to-make-custom-legend-in-matplotlib). Ответ описывает создание пользовательских записей легенд, которые могут быть тем, что вы хотите. – Ian

+2

См. Http://matplotlib.org/users/legend_guide.html#creating-artists-specifically-for-adding-to-the-legend-aka-proxy-artists, который является примером именно этого варианта использования. – tacaswell

ответ

2

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

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

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

Наконец, вы можете точно определить, какие дескрипторы и метки вы хотите отображать в легенде, независимо от данных, отображаемых на вашем графике.

См MWE ниже, иллюстрирует пункты, указанные выше:

import matplotlib.pyplot as plt 
import numpy as np 

plt.close('all') 

# Gererate some datas: 
x = np.random.rand(50) 
y = np.arange(len(x)) 

# Plot data: 
fig, ax = plt.subplots(figsize=(11, 4)) 
fillA = ax.fill_between(y, x-0.25, 0.5, color='darkolivegreen', alpha=0.65, lw=0) 
fillB = ax.fill_between(y, x, 0.5, color='indianred', alpha=0.75, lw=0) 

linec, = ax.plot(y, np.zeros(len(y))+0.5, color='blue', lw=1.5) 
linea, = ax.plot(y, x, color='orange', lw=1.5) 
lineb, = ax.plot(y, x-0.25, color='black', lw=1.5) 

# Define an arbitrary legend handle with a proxy: 
rec1 = plt.Rectangle((0, 0), 1, 1, fc='blue', lw=0, alpha=0.25) 

# Generate the legend: 
handles = [linea, lineb, linec, fillA, fillB, (fillA, fillB), 
      rec1, (fillA, fillB, rec1)] 
labels = ['a', 'b', 'c', 'A', 'B', 'A+B', 'C', 'A+B+C'] 
ax.legend(handles, labels, loc=2, ncol=4) 

ax.axis(ymin=-1, ymax=2) 

plt.show() 

enter image description here

1

Да, вы абсолютно правы ian_itor, tacaswell и Жан-Себастьен, определяемые пользователем легенда, кажется, единственным решением , кроме того, я сделал различную ширину линии для той области, которую можно отличить от кривых, а игра с alpha получила нужный цвет.

handles, labels = ax.get_legend_handles_labels() 
display = (0,1,2,3,4) 

overlap_1 = plt.Line2D((0,1),(0,0), color='firebrick', linestyle='-',linewidth=15, alpha = 0.85) 
overlap_2= plt.Line2D((0,1),(0,0), color='darkolivegreen',linestyle='-',linewidth=15, alpha = 0.65) 
over_lo_3= plt.Line2D((0,1),(0,0), color='indianred',linestyle='-',linewidth=15, alpha = 0.75) 

ax.legend([handle for i,handle in enumerate(handles) if i in display]+[overlap_1 , overlap_2 , overlap_3 ], 
     [label for i,label in enumerate(labels) if i in display]+['D','F','G']) 

enter image description here

+0

Вместо этого игры, чтобы найти правильный цвет для 'over_lo_3', было бы возможно также просто объединить дескриптор' overlap_1' и 'overlap_2', просто используя' (overlap_1, overlap_2) 'вместо' over_lo_3', когда вы определяете легенду , Но ваше решение работает хорошо, так хорошая работа. –

+0

Получил! благодаря! – Hamidreza

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