【问题标题】:Seaborn barplot add horizontal line at different heightsSeaborn barplot 在不同高度添加水平线
【发布时间】:2021-12-14 07:57:32
【问题描述】:

我有一个条形图,我想根据 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. 如果是这样,我如何调整所有边缘以适应我的需要?

【问题讨论】:

    标签: python pandas seaborn


    【解决方案1】:

    这可以在您的轴上使用hlines 来实现,例如在遍历数据框的行时。代码如下所示:

    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)
    
    # iterate over range of number of rows
    for i in range(len(df)):
        ax.hlines(y = df.Hor[i], xmin = i-0.5, xmax = i+0.5,
                  color = 'black')
    

    绘制条形图时,第一个条形的 x 坐标从零开始,增量为 1。此信息可用于将xminxmax 分配给ax.hlines,此处以i 的形式从零到数据框的行数减一。您可以根据需要自定义0.5,具体取决于所需行的“宽度”。

    【讨论】:

      【解决方案2】:

      您可以遍历条形图中的补丁,提取宽度和位置并使用 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')
      

      【讨论】:

      • 看起来很棒!由于一些难以理解的(对我来说:))原因,在我的实际数据中我得到一个错误,因为 ix 的值比数据帧的行多一。我知道这可能很难回答,但即使是最微弱的暗示也能说明为什么会这样?
      • 是的,从远处很难分辨。您应该生成与数据框中的行数相同的条形图。反过来,这个数字控制ix 的高度。
      • 哦,好吧,我想这对我来说仍然是个谜。我添加了一个休息时间(让我感到羞耻!)。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多