我正在尝试使用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()
输出:
此代码删除图例中所需的变量,并在图例中正确替换它。但是,颜色是错误的。颜色应该是红色,紫色和深灰色。不应该有任何浅蓝色的曲线曲线。但是,在输出中,图例中出现了浅蓝色。
有没有办法抑制图例中的图标A,C,D,并用浅蓝色的H替换它们?
其他信息:
在最后一个图例中,标签H应该是浅蓝色曲线。标签B,E,F应该用于非浅蓝色曲线。当前代码的问题是变量E错误地显示为浅蓝色。
答案 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方法对我有用,我只是因为它给出了所需的结果。