我正在尝试在图形上绘制两条线,并且努力使我的图例颜色与图形线颜色匹配。当我尝试为绘图上的线条分配颜色时,它只会更改图例,尽管它确实会更改图形的线条颜色,但它们也不会与图例匹配!
这是我代码的基础。
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的错误,因为我的所有数据都是非常小的浮点数-但是,如果您有任何见解,也将不胜感激!
答案 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,这可以为您节省很多时间;-)