首页 > 解决方案 > Seaborn barplot 在不同高度添加水平线

问题描述

我有一个条形图,我想根据 pandas 列值在每个条形中添加一条水平线。我已经看到了如何在所有条上添加一条水平线的示例,但这不是我的目标。

到目前为止,我尝试过的是:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([[1, 2, 1], [2, 4, 3], [3, 6, 1], [4, 8, 3]], columns=["X", "Value", "Hor"])
fig, ax = plt.subplots()
sns.barplot(x="X", y="Value", data=df, color='green', ax=ax)
sns.barplot(x="X", y="Hor", data=df, color='green', linewidth=2.5, edgecolor='black', ax=ax)

在此处输入图像描述

这与我想要的比较接近,但我只想要顶部边缘,最好是虚线。

我的问题是双重的:

  1. 这是这样做的方法吗?通过将两个条形图堆叠在一起?
  2. 如果是这样,我该如何调整所有边缘以适应我的需要?

标签: pythonpandasseaborn

解决方案


您可以迭代 barplot 中的补丁,提取宽度和位置并使用 plt.plot 绘制值。请注意,如果数据框未排序,这将中断。

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([[1, 2, 1], [2, 4, 3], [3, 6, 1], [4, 8, 3]], columns=["X", "Value", "Hor"])
fig, ax = plt.subplots()
sns.barplot(x="X", y="Value", data=df, color='green', ax=ax)

for ix, a in enumerate(ax.patches):
    
    x_start = a.get_x()
    width = a.get_width()
    
    ax.plot([x_start, x_start+width], 2*[df.loc[ix, 'Hor']], '--', c='k')

在此处输入图像描述


推荐阅读