python - 使用 matplotlib 显示高度为零的条形图

标签 python matplotlib

我有一个包含 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()

结果如下:

enter image description here

您可以根据自己的喜好调整样式。我只是关注如何生成点和细垂直线。

关于python - 使用 matplotlib 显示高度为零的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73445901/

相关文章:

python - Matplotlib - 断轴示例 : uneven subplot size

python - 具有彩色高度的 Matplotlib 3D 瀑布图

python - 排除正则表达式中的字符串

python - 使用 Python 从电子邮件中提取文本

python - 我如何为每个请求(或线程)添加不同的代理到 scrapy

python - 如何去除情节中不必要的直线?

python - 除非编辑字段不为空,否则如何禁用按钮?

python - 当我将标签添加到解析树时,lxml 中的 pretty-print 失败

python - 如何读取文本文件并使用 matplotlib 进行绘图

python - matplotlib 中轴的刻度格式