Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib(无熊猫)在同一绘图中绘制不同y轴的条形图和直线_Python_Matplotlib_Bar Chart_Linechart - Fatal编程技术网

Python 使用matplotlib(无熊猫)在同一绘图中绘制不同y轴的条形图和直线

Python 使用matplotlib(无熊猫)在同一绘图中绘制不同y轴的条形图和直线,python,matplotlib,bar-chart,linechart,Python,Matplotlib,Bar Chart,Linechart,条形图数据: 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': 29

条形图数据:

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值


唯一的问题是,条形图数据中的键属于
字符串类型。除此之外,线图不提供x值,因此,
avg_值
仅在其索引上绘制。
因此,假设您解决了数据类型问题,此代码应该可以工作:

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')
请注意,您不需要根据dict的键或值创建列表

但是,如果出于任何原因无法更改
sum\u values.keys()
的数据类型,则可以将该类型强制转换为barplot命令的int inline,如下所示:

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)

过滤普通年份的数据准备:

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')

我已将折线图/avg_值的键转换为int,并使用您建议的代码在同一图表中绘制双图表。注意到有些值的x值是小数点5(例如,2002.5、2007.5),为什么会这样?我还尝试为commonx计算,但出现了以下错误:TypeError:'numpy.float64'对象不可调用,知道为什么吗?谢谢第一个问题:因为x轴是float类型,ticj是自动放置的。但是你也可以手动控制。第二个问题:如果没有产生此错误的代码,很难判断。我唯一能说的是,我发布的代码没有抛出错误。我尝试运行简单的代码,如“min([1,2,3]),它抛出了相同的错误。发生了什么事@spghttcdy您以前可能定义了
min
sum
之类的变量,现在您希望使用这些python关键字的原始含义。例如,您可以
del(min)
扔掉选择了这个错误名称的变量,然后重试。