Python matplotlib中的通用图例

Python matplotlib中的通用图例,python,matplotlib,charts,legend,Python,Matplotlib,Charts,Legend,我正在matplotlib中绘制网格。我有一个3*2的子地块网格,如下所示: 我在每个子图中绘制折线图,每种颜色的线指定一个类别。 让我们假设color_name={cat1:red,cat2:black,…} 现在,颜色的含义在每个子图中都是相同的,但它们可能只包含颜色名称dict类别的子集。我需要一个包含dict color_名称中颜色类别对的绘图的通用图例。 我已经搜索了很多,但我没有找到一种方法直接使用dict制作图例,以便只包含dict中的每个键值对一次。 这里X轴包含日期,y值表示

我正在matplotlib中绘制网格。我有一个3*2的子地块网格,如下所示:

我在每个子图中绘制折线图,每种颜色的线指定一个类别。 让我们假设color_name={cat1:red,cat2:black,…} 现在,颜色的含义在每个子图中都是相同的,但它们可能只包含颜色名称dict类别的子集。我需要一个包含dict color_名称中颜色类别对的绘图的通用图例。 我已经搜索了很多,但我没有找到一种方法直接使用dict制作图例,以便只包含dict中的每个键值对一次。 这里X轴包含日期,y值表示每天

代码:

def graph_data(data):
''' Return html for graph for one department '''

fig, axes = plt.subplots( nrows=3,
                          ncols=2,
                          sharex = True,
                          figsize=(14, 10),
                          facecolor = 'w' , 
                          )

rownames = sorted(data.keys())
beautify(fig, axes, rownames )

plt.close()

color_name = get_color_name_dict()

for i, metric in enumerate(sorted(data.keys())):
    for j, device in enumerate(sorted(data[metric].keys())):
        ax = axes[i , j]

        ylow = 10000
        yhigh = 0

        for page in data[metric][device].keys():
            dd = data[metric][device][page]

            x = dd.keys()

            y = [statify(dd[_date]) for _date in x]

            ylow = min(ylow , min(y))
            yhigh = max(yhigh, max(y))

            ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
            ax.xaxis.set_major_locator(mdates.DayLocator())

            ax.plot(y , color = color_name[page], label = page , linewidth = '2')

            ax.fmt_xdata = mdates.DateFormatter('%d-%m-%Y')

            for tick in ax.get_xticklabels():
                tick.set_rotation(45)


            fig.autofmt_xdate()

        ax.set_ylim([ylow-200 , yhigh+200])



fig.tight_layout()
# tight_layout doesn't take these labels into account. We'll need 
# to make some room. These numbers are are manually tweaked. 
fig.subplots_adjust(left=0.18, top=0.95, right=0.95, bottom = 0.05)

imgdata = cStringIO.StringIO()
fig.savefig(imgdata, format='png' , facecolor = fig.get_facecolor())

s = '<img alt = "embedded" src = "data:image/png;base64,%s"/>' % imgdata.getvalue().encode("base64").strip()

orig_stdout = sys.stdout
f = open("test.html" , "w")
sys.stdout = f

print s

sys.stdout = orig_stdout
f.close()

print "done"
mpld3.show(fig)
#return s

您必须使用
figlegend
:如果您需要更多详细信息,请发布您的代码。非常感谢,它真的很有帮助:)
def beautify(fig, axes, rows):
''' Beautify the plot '''
style.use('ggplot')

cols = ['Desktop' , 'Mobile']

for ax in axes[:,0]:
    ax.set_ylabel("Median (ms)")




pad = 5 # in points

for ax, col_name in zip(axes[0], cols):
    ax.annotate(col_name, xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                size='large', ha='center', va='baseline')

for ax, row_name in zip(axes[:,0], rows):
    ax.annotate(row_name, xy=(0, 0.5), xytext=(-ax.yaxis.labelpad - pad, 0),
                xycoords=ax.yaxis.label, textcoords='offset points',
                size='large', ha='right', va='center')