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



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

这是我的代码基础。

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()

这是我得到的: 输出图

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

如果我删除"r-"和"b-",我会得到下图:输出图 2

还是不对...

我是python和编码的新手,所以如果您需要更多信息,请告诉我。感谢您的任何帮助!

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

errobar 线隐藏了图例中显示的线条。您可以删除多余的图,然后以相应的颜色绘制 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")

您基本上是在初始线图上绘制误差线。默认情况下,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()

尝试在调用 plot 时设置标签并删除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,这可能会为您节省大量时间;-(

最新更新