JNe*_*ens 5 python plot matplotlib
我正在使用 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()
Run Code Online (Sandbox Code Playgroud)
使用此代码,我在一个图上得到 6 行(这是我想要的)。然而,误差线完全重叠,使得图难以阅读。
有没有办法可以稍微移动 x 轴上每个点的位置,以便误差线不再重叠?
这是一个屏幕截图:
实现您想要的一种方法是“手动”绘制误差线,但它既不直接,也不比原始的好看得多。基本上,您要做的是pandas生成线图,然后遍历数据框列并errorbar为每个列绘制pyplot图,这样索引会稍微向侧面移动(在您的情况下,x 轴上的对数刻度,这将是一个因素的转变)。在误差条图中,标记大小设置为零:
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()
Run Code Online (Sandbox Code Playgroud)
正如我所说,结果并不漂亮:
更新
在我看来,条形图会提供更多信息:
fig2,ax2 = plt.subplots()
df.plot(kind='bar',yerr=df_yerr, ax=ax2)
plt.show()
Run Code Online (Sandbox Code Playgroud)