График и линия на одном и том же графике, разные оси Y с использованием matplotlib - PullRequest
0 голосов
/ 23 декабря 2018

Данные для гистограммы:

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

Снимок экранамоего результата построения графика: Screenshot of my graphing result

  • Как я могу построить линейный график со вторичной осью y?

  • Поскольку значения x для двух диаграмм различны, как можно построить график только для общих значений x?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Подготовка данных для фильтрации общих лет:

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

enter image description here

0 голосов
/ 23 декабря 2018

Единственная проблема заключается в том, что ключи в ваших данных Barchart имеют тип 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')

Обратите внимание, что вам не нужно составлять списки на основе ключей или значений dict.

Однако, если по какой-либо причине вы не можете изменить тип данных sum_values.keys(), вы можете привести тип к int inline команды barplot следующим образом:

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

(В случае объекта карты вам необходимо составить список его результатов)

enter image description here

Для просмотра только части общих значений 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)

enter image description here

...