【问题标题】:How can I plot a secondary y-axis with seaborn's barplot?如何使用 seaborn 的条形图绘制辅助 y 轴?
【发布时间】:2021-05-04 12:29:45
【问题描述】:

我正在尝试绘制数据(见下文)。 x 轴为 company_name,y 轴为 status_mission_2_y,另一个 y_axis 为百分比。我尝试过使用 twinx() 函数,但我无法让它工作。

请问您能帮忙吗?提前致谢!

def twinplot(data):
    x_ = data.columns[0]
    y_ = data.columns[1]
    y_2 = data.columns[2]
    
    data1 = data[[x_, y_]]
    data2 = data[[x_, y_2]]
    plt.figure(figsize=(15, 8))
    ax = sns.barplot(x=x_, y=y_, data=data1)
    
    ax2 = ax.twinx()
    g2 = sns.barplot(x=x_, y=y_2, data=data2, ax=ax2)
    plt.show()


data = ten_company_missions_failed
twinplot(data)
company_name percentage status_mission_2_y
EER 1 1
Ghot 1 1
Trv 1 1
Sandia 1 1
Test 1 1
US Navy 0.823529412 17
Zed 0.8 5
Gov 0.75 4
Knight 0.666666667 3
Had 0.666666667 3

【问题讨论】:

    标签: python matplotlib seaborn yaxis twinx


    【解决方案1】:

    Seaborn 用相同的颜色和相同的 x 位置绘制两个条形图。

    以下示例代码调整条的宽度,属于ax 的条向左移动。 ax2 的条形图向右移动。为了区分右侧的条,使用了半透明 (alpha=0.7) 和阴影。

    import matplotlib.pyplot as plt
    from matplotlib.ticker import PercentFormatter
    import pandas as pd
    import seaborn as sns
    from io import StringIO
    
    data_str = '''company_name  percentage  status_mission_2_y
    EER 1   1
    Ghot    1   1
    Trv 1   1
    Sandia  1   1
    Test    1   1
    "US Navy"   0.823529412 17
    Zed 0.8 5
    Gov 0.75    4
    Knight  0.666666667 3
    Had 0.666666667 3'''
    data = pd.read_csv(StringIO(data_str), delim_whitespace=True)
    
    x_ = data.columns[0]
    y_ = data.columns[1]
    y_2 = data.columns[2]
    
    data1 = data[[x_, y_]]
    data2 = data[[x_, y_2]]
    plt.figure(figsize=(15, 8))
    ax = sns.barplot(x=x_, y=y_, data=data1)
    width_scale = 0.45
    for bar in ax.containers[0]:
        bar.set_width(bar.get_width() * width_scale)
    ax.yaxis.set_major_formatter(PercentFormatter(1))
    
    ax2 = ax.twinx()
    sns.barplot(x=x_, y=y_2, data=data2, alpha=0.7, hatch='xx', ax=ax2)
    for bar in ax2.containers[0]:
        x = bar.get_x()
        w = bar.get_width()
        bar.set_x(x + w * (1- width_scale))
        bar.set_width(w * width_scale)
    
    plt.show()
    

    更简单的替代方法是将barplotax 结合起来,将lineplotax2 结合起来。

    plt.figure(figsize=(15, 8))
    ax = sns.barplot(x=x_, y=y_, data=data1)
    ax.yaxis.set_major_formatter(PercentFormatter(1))
    
    ax2 = ax.twinx()
    sns.lineplot(x=x_, y=y_2, data=data2, marker='o', color='crimson', lw=3, ax=ax2)
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2015-01-17
      • 2019-05-24
      相关资源
      最近更新 更多