线图中不重叠的误差线

5

我正在使用Pandas和Matplotlib创建一些图表。我想要带有误差线的折线图。我目前使用的代码如下:

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

df = pd.DataFrame(index=[10,100,1000,10000], columns=['A', 'B', 'C', 'D', 'E', 'F'], data=np.random.rand(4,6))
df_yerr = pd.DataFrame(index=[10,100,1000,10000], columns=['A', 'B', 'C', 'D', 'E', 'F'], data=np.random.rand(4,6))

fig, ax = plt.subplots()
df.plot(yerr=df_yerr, ax=ax, fmt="o-", capsize=5)
ax.set_xscale("log")
plt.show()

使用这段代码,我在一个图表上得到了6条线(这正是我想要的)。然而,误差棒完全重叠,使得图表难以阅读。
有没有办法稍微移动每个点在x轴上的位置,以便误差棒不再重叠?
以下是截图: enter image description here

你能展示一下你所得到的图形截屏吗? - DavidG
@DavidG 希望这样能让我的问题更清楚。 - JNevens
2
为了获得更好的帮助,请提供一个最小、完整和可验证的示例。特别是请查看如何创建良好的可重现的pandas示例 - Diziet Asahi
您可以移动点和误差线,但这将使图表失真,因为点将不再位于正确的x位置。您确定要这样做吗? - ImportanceOfBeingErnest
2个回答

6
您想做到的一种方法是手动绘制误差条,但这既不直观,也不比您原始的方法更好看。基本上,您需要让 pandas 生成线图,然后迭代数据帧列并为每个列使用 pyplot 的 errorbar 绘图函数进行绘制,使得索引略微向侧面移动(在您的情况下,对数坐标轴会有一个因子的偏移)。在误差栏绘图中,将标记大小设置为零:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

colors = ['red','blue','green','yellow','purple','black']

df = pd.DataFrame(index=[10,100,1000,10000], columns=['A', 'B', 'C', 'D', 'E', 'F'], data=np.random.rand(4,6))
df_yerr = pd.DataFrame(index=[10,100,1000,10000], columns=['A', 'B', 'C', 'D', 'E', 'F'], data=np.random.rand(4,6))

fig, ax = plt.subplots()
df.plot(ax=ax, marker="o",color=colors)

index = df.index
rows = len(index)
columns = len(df.columns)

factor = 0.95
for column,color in zip(range(columns),colors):
    y = df.values[:,column]
    yerr = df_yerr.values[:,column]
    ax.errorbar(
        df.index*factor, y, yerr=yerr, markersize=0, capsize=5,color=color,
        zorder = 10,
    )
    factor *= 1.02

ax.set_xscale("log")
plt.show()

正如我所说,结果并不是很美观:

上述代码的结果

更新

我认为一张条形图会更加具有信息性:

fig2,ax2 = plt.subplots()
df.plot(kind='bar',yerr=df_yerr, ax=ax2)
plt.show()

result of second piece of code


我只是想指出,条形图通常比精心制作的散点图或箱线图(在传达信息方面)要逊色。许多人可能会说,我也同意,条形图在视觉上比上述图更具吸引力。然而,这并不能证明选择条形图是正确的,因为有更好的选择(无论是在视觉上还是信息上)。为了支持这一说法,可以参考这里 - Matthias Arras
@MatthiasArras 我同意你的看法,确实有更好的选择。然而需要注意的是,我们并不知道 OP 想要可视化的内容,因此很难确定哪种图表类型最适合呈现他的数据。 - Thomas Kühn

-2

你可以用alpha来解决问题,例如:

df.plot(yerr=df_yerr, ax=ax, fmt="o-", capsize=5,alpha=0.5)

您也可以参考链接进行查看


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接