我有一个包含 2 个数字的数组的数据集。这些值的差值应该是条形高度。我遇到的问题是,如果这些数字相等,则高度为零,因此不会绘制条形图。
但我需要将它们显示为一条非常细的线(或点或其他东西)。 带 bar(x, height) 的子图是否错误? 我尝试在差异中添加一个小值,但我的 y 轴刻度非常动态。 所以在 1-100 的范围内加上 0.1 就可以了。 0.001-0.05 的比例太大了。
我应该使用 ax.errorbar() 还是有更好的方法?
编辑:\
import matplotlib.pyplot as plt
import pandas as pd
df=pd.DataFrame()
df["desc"] = ("A","B","C","D","E")
df["a"] = (0.1,0.5,1,0.6,0.4)
df["b"] = (0.3,0.6,0.6,0.7,0.4)
fig, ax = plt.subplots()
ax.bar(x=df['desc'],
bottom=df['a'],
height=df['b'] - df['a'])
ax.set_ylim(bottom=0, top=1.2)
new_yticks = list(set(df['a']).union(df['b']))
plt.yticks(new_yticks)
plt.show()
在这里您可以看到第五个值(x 轴“E”)未绘制。 或者可能已绘制但由于高度为零而不可见。
编辑2: 迄今为止最好的方法是:
avg=df["a"].mean()/100
print(avg)
ax.bar(x=df['desc'],
bottom=df['a'],
height=df['b'] - df['a'] + avg)
最佳答案
IIUC,您正在寻找“plt.vlines”。给定您的导入和数据框,您可以使用以下代码:
x = df["desc"].to_list()
y1 = df["a"].to_list()
y2 = df["b"].to_list()
plt.scatter(x, y1, marker="o", label="a")
plt.scatter(x, y2, marker="x", label="b")
plt.vlines(x, y1, y2, alpha=.8, lw=1, colors="grey")
plt.legend()
plt.show()
结果如下:
您可以根据自己的喜好调整样式。我只是关注如何生成点和细垂直线。
关于python - 使用 matplotlib 显示高度为零的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73445901/