我的图例颜色与我的图形线条颜色不匹配?

时间:2019-09-02 09:59:31

标签: python matplotlib legend

我正在尝试在图形上绘制两条线,并且努力使我的图例颜色与图形线颜色匹配。当我尝试为绘图上的线条分配颜色时,它只会更改图例,尽管它确实会更改图形的线条颜色,但它们也不会与图例匹配!

这是我代码的基础。

import pandas as pd
import matplotlib.pyplot as plt

df_mated = pd.read_csv("file1.txt", sep='\t', header=0)   
df_mated['Average'] = df_mated.mean(axis=1)
df_mated['SEM'] = df_mated.loc[:, :'Average'].sem()
mated_E = df_mated['SEM'].tolist()
b = df_mated['Average'].tolist()
plot1, = plt.plot(x, b, 'r-')
plt.errorbar(x, b, xerr=None, yerr=mated_E)

df_unmated = pd.read_csv("file2.txt", sep='\t', header=0) 
df_unmated['Average'] = df_unmated.mean(axis=1)
df_unmated['SEM'] = df_unmated.loc[:, :'Average'].sem()
unmated_E = df_unmated['SEM'].tolist()
c = df_unmated['Average'].tolist()
plot2, = plt.plot(x, c, 'b-')
plt.errorbar(x, c, xerr=None, yerr=unmated_E)

plt.xlabel('Position')
plt.ylabel('Average Read Depth')
plt.legend([plot1,plot2],["Mated", "Unmated"])
plt.show()

这就是我得到的: Output Graph

如您所见,颜色不匹配,但更重要的是,配对的红色线确定应该是图形上的顶线。我已经通过打印列表b和c对此进行了验证,所以我确定。

如果我删除“ r-”和“ b-”,则会得到以下图形:Output Graph 2

仍然不正确...

我是python和编码的新手,所以让我知道您是否需要更多信息。感谢您的帮助!

P.S正如您可能能够看到的那样,我的误差线也仅适用于一半的图形,因为.sem()对我的熊猫数据框中的某些值产生NaN。我认为这可能是由于除以0的错误,因为我的所有数据都是非常小的浮点数-但是,如果您有任何见解,也将不胜感激!

3 个答案:

答案 0 :(得分:2)

错误线会隐藏您在图例中显示的行。您可以只删除多余的图,而仅以相应的颜色绘制errobar(线)。所以代替

plot1, = plt.plot(x, b, 'r-')
plt.errorbar(x, b, xerr=None, yerr=mated_E)
# ...
plot2, = plt.plot(x, c, 'b-')
plt.errorbar(x, c, xerr=None, yerr=unmated_E)

使用

plot1, _, _ = plt.errorbar(x, b, xerr=None, yerr=mated_E, color="r")
# ...
plot2, _, _ = plt.errorbar(x, c, xerr=None, yerr=unmated_E, color="b")

答案 1 :(得分:1)

您基本上是在初始线条图上绘制误差线。默认情况下,plt.errorbar是在每个点上都有误差线的线图。

# Gives a red line plot
plot1, = plt.plot(x, b, 'r-')
# Gives a '#1f77b4' (default first color) line plot with error bars
plt.errorbar(x, b, xerr=None, yerr=mated_E)

给出您的蓝线。同样可以应用于第二个情节。

只需添加一种线型即可停用将errobar的点与ls=''连接的线

下面的更正应该起作用:

import pandas as pd
import matplotlib.pyplot as plt

df_mated = pd.read_csv("file1.txt", sep='\t', header=0)   
df_mated['Average'] = df_mated.mean(axis=1)
df_mated['SEM'] = df_mated.loc[:, :'Average'].sem()
mated_E = df_mated['SEM'].tolist()
b = df_mated['Average'].tolist()
plot1, = plt.plot(x, b, 'r-')
# Plot only the y-errorbar, not the line connecting the datapoint
plt.errorbar(x, b, xerr=None, yerr=mated_E, ls='')

df_unmated = pd.read_csv("file2.txt", sep='\t', header=0) 
df_unmated['Average'] = df_unmated.mean(axis=1)
df_unmated['SEM'] = df_unmated.loc[:, :'Average'].sem()
unmated_E = df_unmated['SEM'].tolist()
c = df_unmated['Average'].tolist()
plot2, = plt.plot(x, c, 'b-')
# Plot only the y-errorbar, not the line connecting the datapoint
plt.errorbar(x, c, xerr=None, yerr=unmated_E, ls='')

plt.xlabel('Position')
plt.ylabel('Average Read Depth')
plt.legend([plot1,plot2],["Mated", "Unmated"])
plt.show()

答案 2 :(得分:0)

在调用图时尝试设置标签并删除plt.plot行,然后仅在不带参数的情况下调用plt.legend()

plt.errorbar(x, b, xerr=None, yerr=mated_E, fmt='r-', label='Mated') 
plt.errorbar(x, c, xerr=None, yerr=unmated_E, fmt='b-', label='Unmated')
plt.legend()

正在发生的情况是颜色是正确的,但隐藏在错误栏图的后面。 plt.errorbar绘制线条和错误。由于您是在第一个图上而不是第二个图上设置颜色,因此最终颜色会有所不同。

对于错误条,请检查值是否全部相同。在这种情况下,标准偏差将为零。

您还可以使用seaborn,这可以为您节省很多时间;-)