【问题标题】:Line doesn't show over barplot线条不显示在条形图上
【发布时间】:2018-09-28 08:50:29
【问题描述】:

我正在尝试在条形图上绘制一条线。

这是我的数据框:

       meh  fiches     ratio
2007  1412    1338  0.947592
2008  1356    1324  0.976401
2009  1394    1298  0.931133
2010  1352    1275  0.943047
2011  1398    1325  0.947783
2012  1261    1215  0.963521
2013  1144     845  0.738636
2014  1203    1167  0.970075
2015  1024    1004  0.980469
2016  1197    1180  0.985798

当我运行这两行时,我得到:

ax = graph[['meh', 'fiches']].plot(kind='bar', color=['#666666','#999999'])
graph[['ratio']].plot(kind='line',color='red', linestyle='-', secondary_y=True, ax=ax)

但是,如果我删除 kind='bar' 我会得到三行,如果我将 kind='line' 更改为 kind='bar' 我会得到三行...

【问题讨论】:

    标签: python python-3.x pandas dataframe matplotlib


    【解决方案1】:

    问题是你的条被绘制为类别,而你的线被绘制在一个连续的轴上 - 所以虽然你的条的 x 位置看起来好像它们是年份,但它们实际上是 0 到 9 的值。要获得围绕这一点,您可以在使用ax.get_xticks() 绘制比率时指定 x 值:

    import io
    
    import pandas as pd
    import matplotlib.pyplot as plt
    
    data = io.StringIO('''       meh  fiches     ratio
    2007  1412    1338  0.947592
    2008  1356    1324  0.976401
    2009  1394    1298  0.931133
    2010  1352    1275  0.943047
    2011  1398    1325  0.947783
    2012  1261    1215  0.963521
    2013  1144     845  0.738636
    2014  1203    1167  0.970075
    2015  1024    1004  0.980469
    2016  1197    1180  0.985798''')
    
    graph = pd.read_csv(data, sep='\s+')
    
    ax = graph[['meh', 'fiches']].plot(kind='bar', color=['#666666','#999999'])
    graph[['ratio']].plot(x=ax.get_xticks(), kind='line',color='red', linestyle='-', secondary_y=True, ax=ax)
    
    plt.show()
    

    这表明:

    【讨论】:

    • 我更喜欢 x=ax.get_xticks() 的把戏,而不是强迫岁月成为字符串
    • @PaulH 我不认为它在这种情况下特别有区别,但是如果数据来自多个数据帧,看看它会如何变化会很有趣。使用字符串会允许一个数据框丢失一年,并且仍然在正确的位置绘制吗?
    • 假设 matplotlib 的版本足够新,它应该。
    【解决方案2】:

    就其性质而言,条形图具有分类 x 轴。但是线图有连续的 x 轴,除非你强制使用它。

    所以,你可以强迫你的岁月成为字符串,得到你想要的:

    from io import StringIO
    from matplotlib import pyplot
    import pandas
    
    df = pandas.read_table(StringIO("""\
    year   meh  fiches     ratio
    2007  1412    1338  0.947592
    2008  1356    1324  0.976401
    2009  1394    1298  0.931133
    2010  1352    1275  0.943047
    2011  1398    1325  0.947783
    2012  1261    1215  0.963521
    2013  1144     845  0.738636
    2014  1203    1167  0.970075
    2015  1024    1004  0.980469
    2016  1197    1180  0.985798
    """), sep='\s+', dtype={'year': str}).set_index('year')
    
    ax = df[['meh', 'fiches']].plot(kind='bar', color=['#666666','#999999'])
    df[['ratio']].plot(kind='line',color='red', linestyle='-', secondary_y=True, ax=ax)
    

    【讨论】:

    • 这是一个非常巧妙的解决 matplotlib 怪癖的方法,+1
    • 我在我的代码中看不到那条红线。
    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2018-02-07
    相关资源
    最近更新 更多