Matplotlib抑制图例条目并替换为公共条目

时间:2015-12-27 15:24:51

标签: python python-2.7 matplotlib legend

我正在尝试使用matplotlib在Python 2.7中生成一个图。

该图有6个y变量 - 我只需要在图例中显示其中的3个。对于要跳过的其余变量,我需要将它们绘制为图例中的通用名称。为了确定图例中要跳过的内容,我有一个Python列表。例如。对于变量A,B,C,D,E,FI需要用一个名为H的变量替换A,C和D,以便图例有H,B,E,F而不是A,B,C,D,E, F。

另外,我需要在每个变量中使用用户指定的颜色。用户指定所有6个变量的颜色 - 用户为必须替换的变量选择相同的颜色。

以下是显示此内容的代码:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import itertools

def flip(items, ncol):
    return itertools.chain(*[items[i::ncol] for i in range(ncol)])

fig = plt.figure()
ax = plt.subplot(111)

# Generate data:
x = pd.DataFrame(zip(*[np.arange(1,11,1)]*6),index=np.arange(10),columns=list('ABCDEF'))
y = pd.DataFrame(np.random.rand(10,6),columns=list('ABCDEF'))
x.insert(0,'tester_x',0)
y.insert(0,'tester_y',0)

# List of Pandas Dataframe columns to suppress in legend:
suppress = ['A', 'C', 'D','H']

colors = ['lightblue','r','lightblue','lightblue','purple','darkgrey']

labels_want = []
# Plot:
for i in range(1,len(y.columns.tolist())):
    if list(y)[i] in suppress:
        ax.plot(x.iloc[:,i], y.iloc[:,i], color = colors[i-1], linestyle='-', marker='o', linewidth=0.75, label=None)
    else:
        labels_want.append(list(y)[i])
        ax.plot(x.iloc[:,i], y.iloc[:,i], color = colors[i-1], linestyle='-', marker='o', linewidth=0.75, label=list(y)[i])
labels_want.insert(0,suppress[-1])

handles, labels = ax.get_legend_handles_labels()

# Put a legend below current axis
ax.legend(flip(handles, 2), flip(labels_want, 2), loc='best',ncol=2,numpoints=1)

plt.show()

输出:

enter image description here

此代码删除图例中所需的变量,并在图例中正确替换它。但是,颜色是错误的。颜色应该是红色,紫色和深灰色。不应该有任何浅蓝色的曲线曲线。但是,在输出中,图例中出现了浅蓝色。

有没有办法抑制图例中的图标A,C,D,并用浅蓝色的H替换它们?

  1. 翻转来源: Matplotlib legend, add items across columns instead of down
  2. 主要绘图代码的来源(显示图表外的图例): How to put the legend out of the plot
  3. 其他信息:

    在最后一个图例中,标签H应该是浅蓝色曲线。标签B,E,F应该用于非浅蓝色曲线。当前代码的问题是变量E错误地显示为浅蓝色。

2 个答案:

答案 0 :(得分:0)

奇怪的颜色出现的原因是因为这一行:

ax.plot(x.iloc[:,i], y.iloc[:,i], color = colors[i-1], linestyle='-', marker='o', linewidth=0.75, label=list(y)[i])

应该是

    ax.plot(x.iloc[:,i], y.iloc[:,i], color = colors[i], linestyle='-', marker='o', linewidth=0.75, label=list(y)[i])

注意颜色的索引差异。调试它的一种快速方法是在设置时明确打印出颜色[i],并确保它正确匹配。

答案 1 :(得分:0)

我认为描述我最终做的事情是值得的,因为我寻求一种干净的方法来实现这一目标并不具有效果。

我生成了我想要的列的图,然后我制作了图例。

if list(y)[i] not in suppress:
        ax.plot(x.loc[:,list(y)[i]], y.loc[:,list(y)[i]], color = colors[i-1], linestyle='-', marker='o', linewidth=0.75, label=None)

这样,我只是忽略了所有其他(不需要的)列。然后就在plt.show()之前和生成图例之后,我只生成了被抑制列的图。

if list(y)[i] in suppress:
        ax.plot(x.loc[:,list(y)[i]], y.loc[:,list(y)[i]], color = colors[i-1], linestyle='-', marker='o', linewidth=0.75, label=None)

这样它完全忽略了图例中被抑制的列。这给了我想要的效果。我必须将iloc()更改为loc(),但这是一个小问题。我确信有一种更好(更优雅)的方式来获得这个结果,但我无法找到一个信息。

这种hacky方法对我有用,我只是因为它给出了所需的结果。