【问题标题】:Plot bar and line in same plot, different y-axes using matplotlib (no pandas)在同一图中绘制条形图和线,使用 matplotlib 不同的 y 轴(无熊猫)
【发布时间】:2018-12-23 06:36:56
【问题描述】:

条形图数据:

sum_values = {2000: 258004, 2001: 243411, 2002: 234801, 2003: 231303, 2004: 235103, 2005: 234102, 2006: 236045, 2007: 262238, 2008: 317133, 2009: 337785, 2010: 379818, 2011: 425237, 2012: 446610}

折线图数据:

avg_values = {'2006': 29034, '2007': 29612, '2008': 28551, '2009': 39320, '2010': 30061, '2011': 24331, '2012': 23579, '2013': 17552, '2014': 17673, '2015': 19620, '2016': 20894}

我的图形代码片段:

plt.figure(1, figsize=(10,10))
barchart = plt.bar(list(sum_values.keys()), list(sum_values.values()), color='red')
linechart = plt.plot(list(sum_values.values()), color='blue')

我的绘图结果的屏幕截图:

  • 如何绘制带有辅助 y 轴的折线图?

  • 由于两个图表的 x 值不同,我怎样才能仅绘制常见的 x 值?

【问题讨论】:

    标签: python matplotlib bar-chart linechart


    【解决方案1】:

    唯一的问题是,您的条形图数据中的键是string 类型。除此之外,您没有为线图提供 x 值,因此 avg_values 仅绘制在其索引上。
    所以假设你修复了数据类型问题,这段代码应该可以工作:

    plt.figure(1, figsize=(10,10))
    
    barchart = plt.bar(sum_values.keys(), sum_values.values(), color='red')
    plt.twinx()
    linechart = plt.plot(avg_values.keys(), avg_values.values(), color='blue')
    

    请注意,您不需要根据字典的键或值创建列表。

    但是,如果您出于某种原因无法更改 sum_values.keys() 的数据类型,您可以将类型转换为 int inline barplot 命令,如下所示:

    barchart = plt.bar(list(map(int, sum_values.keys())), sum_values.values(), color='red')
    

    (如果是地图对象,您确实需要列出其结果)

    对于仅查看常见 x 值部分,您可以在计算常见 x 值后设置 x 轴范围,如:

    commonx = [a for a in avg_values.keys() if a in sum_values.keys()]
    plt.xlim(min(commonx) - .5, max(commonx) + .5)
    

    【讨论】:

    • 我已将折线图/avg_values 的键转换为 int,并使用您建议的代码在同一图中绘制双图。注意到对于某些值(例如 2002.5、2007.5),x 值的小数点为 0.5,为什么会这样?我也尝试计算 commonx,但出现以下错误:TypeError: 'numpy.float64' object is not callable,知道为什么吗?谢谢!
    • 第一个问题:因为x轴是float类型,ticjs是自动放置的。但是您也可以手动控制它。第二个问题:如果没有产生此错误的代码,很难说。只能说我贴的代码没有报错。
    • 我尝试运行像“min([1, 2, 3])”这样的简单代码,但它抛出了同样的错误。怎么了? @SpghttCd
    • 您之前可能定义了minsum 之类的变量,现在想按原意使用这些python 关键字。你可以例如del(min) 用这个错误的名称丢弃你的变量,然后重试。
    【解决方案2】:

    过滤常见年份的数据准备:

    sum_values = {2000: 258004, 2001: 243411, 2002: 234801, 2003: 231303, 2004: 235103, 2005: 234102, 2006: 236045, 2007: 262238, 2008: 317133, 2009: 337785, 2010: 379818, 2011: 425237, 2012: 446610}
    avg_values = {'2006': 29034, '2007': 29612, '2008': 28551, '2009': 39320, '2010': 30061, '2011': 24331, '2012': 23579, '2013': 17552, '2014': 17673, '2015': 19620, '2016': 20894}
    
    from collections import OrderedDict
    avg_values = {int(k):v for k,v in avg_values.items() if int(k) in sum_values.keys()}
    sum_values = {k:v for k,v in sum_values.items() if k in avg_values.keys()}
    
    sum_values=OrderedDict(sorted(sum_values.items()))  
    avg_values=OrderedDict(sorted(avg_values.items()))  
    

    用第二轴绘制共同年份!

    plt.figure(1, figsize=(5,5))
    barchart = plt.bar(avg_values.keys(), avg_values.values(), color='red')
    plt.twinx()
    
    linechart = plt.plot(sum_values.keys(), sum_values.values(), color='blue',label='Sum')
    

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多