【问题标题】:Equivalent of secondary_y for barh in Pandas/Matplotlib?相当于 Pandas/Matplotlib 中 barh 的 secondary_y?
【发布时间】:2019-01-30 08:22:27
【问题描述】:

Pandas 提供nice, simple way 在两个 y 轴上绘制(垂直)条形图。水平条形图是否有等价物?

改编自链接示例:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from io import StringIO
s = StringIO("""     amount     price
A     40929   4066443
B     93904   9611272
C    188349  19360005
D    248438  24335536
E    205622  18888604
F    140173  12580900
G     76243   6751731
H     36859   3418329
I     29304   2758928
J     39768   3201269
K     30350   2867059""")
df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)

_ = df.plot( kind= 'barh' , secondary_y= 'amount' , rot= 0 ) 
# Doesn't work as expected. And there's no secondary_x.

plt.show()

【问题讨论】:

    标签: pandas bar-chart


    【解决方案1】:

    和你问的不太一样:

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    from io import StringIO
    s = StringIO("""     amount     price
    A     40929   4066443
    B     93904   9611272
    C    188349  19360005
    D    248438  24335536
    E    205622  18888604
    F    140173  12580900
    G     76243   6751731
    H     36859   3418329
    I     29304   2758928
    J     39768   3201269
    K     30350   2867059""")
    df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)
    
    ax = df['price'].plot.barh(color='blue', alpha=.5) 
    ax2 = ax.twiny()
    df['amount'].plot.barh(ax=ax2, color='yellow', alpha =.5 )
    plt.show()
    

    输出:

    【讨论】:

      【解决方案2】:

      对您的问题的简短回答是,不,熊猫中的barh 地块没有等效的secondary_y,正如熊猫中的this issue 所证明的那样,它仍然开放。

      这就是我设法达到预期效果的方法。您必须自己计算比例因子,并使用 matplotlib 的 twiny ax 功能。

      import matplotlib.pyplot as plt
      import numpy as np
      import pandas as pd
      from io import StringIO
      s = StringIO("""     amount     price
      A     40929   4066443
      B     93904   9611272
      C    188349  19360005
      D    248438  24335536
      E    205622  18888604
      F    140173  12580900
      G     76243   6751731
      H     36859   3418329
      I     29304   2758928
      J     39768   3201269
      K     30350   2867059""")
      df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)
      fig, ax = plt.subplots(figsize=(10,5))
      
      y_pos = np.arange(len(df))
      scale_factor = 100
      ax.barh(y_pos, df.amount, align='edge', height=0.4, label='amount (top)')
      ax.barh(y_pos, df.price/scale_factor, align='edge', height=-0.4, label='price')
      ax.set_yticks(y_pos)
      ax.set_yticklabels(df.index)
      ax.set_xlabel('Price')
      ax.legend()
      
      ax2 = ax.twiny()
      ax2.set_xticks(ax.get_xticks())
      ax2.set_xbound(ax.get_xbound())
      ax2.set_xticklabels([int(x*scale_factor) for x in ax.get_xticks()])
      ax2.set_xlabel('Amount')
      
      plt.show()
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 2019-09-08
        相关资源
        最近更新 更多