简体   繁体   中英

Nested dictionary to line graph - Python 3

How can I get the following dictionary into a line graph?

The dictionary key ['drawing'] contains a list with two dummy variables ('tiger' and 'elephant'). Each subject has a key ['points'] and a list of dictionaries with ['dates'] and ['values']. I'd like one graph with both subjects and the dates plotted on the x-axis and the values on the y-axis.

{'drawing': [{'subject': 'tiger', 'points': [{'dates': '2016-12-31', 'values': 36.0}, {'dates': '2017-01-01', 'values': 34.0}, {'dates': '2017-01-02', 'values': 50.0}, {'dates': '2017-01-03', 'values': 20.0}, {'dates': '2017-01-04', 'values': 27.0}, {'dates': '2017-01-05', 'values': 55.0}, {'dates': '2017-01-06', 'values': 34.0}, {'dates': '2017-01-07', 'values': 23.0}, {'dates': '2017-01-08', 'values': 25.0}, {'dates': '2017-01-09', 'values': 74.0}, {'dates': '2017-01-10', 'values': 43.0}, {'dates': '2017-01-11', 'values': 31.0}, {'dates': '2017-01-12', 'values': 19.0}, {'dates': '2017-01-13', 'values': 34.0}, {'dates': '2017-01-14', 'values': 55.0}, {'dates': '2017-01-15', 'values': 19.0}, {'dates': '2017-01-16', 'values': 19.0}, {'dates': '2017-01-17', 'values': 32.0}, {'dates': '2017-01-18', 'values': 26.0}, {'dates': '2017-01-19', 'values': 40.0}, {'dates': '2017-01-20', 'values': 24.0}, {'dates': '2017-01-21', 'values': 52.0}, {'dates': '2017-01-22', 'values': 25.0}, {'dates': '2017-01-23', 'values': 56.0}, {'dates': '2017-01-24', 'values': 66.0}, {'dates': '2017-01-25', 'values': 19.0}, {'dates': '2017-01-26', 'values': 50.0}, {'dates': '2017-01-27', 'values': 23.0}, {'dates': '2017-01-28', 'values': 50.0}, {'dates': '2017-01-29', 'values': 30.0}, {'dates': '2017-01-30', 'values': 43.0}, {'dates': '2017-01-31', 'values': 37.0}, {'dates': '2017-02-01', 'values': 58.0}, {'dates': '2017-02-02', 'values': 30.0}, {'dates': '2017-02-03', 'values': 23.0}, {'dates': '2017-02-04', 'values': 100.0}, {'dates': '2017-02-05', 'values': 25.0}, {'dates': '2017-02-06', 'values': 37.0}, {'dates': '2017-02-07', 'values': 57.0}, {'dates': '2017-02-08', 'values': 31.0}, {'dates': '2017-02-09', 'values': 19.0}, {'dates': '2017-02-10', 'values': 38.0}, {'dates': '2017-02-11', 'values': 34.0}, {'dates': '2017-02-12', 'values': 19.0}, {'dates': '2017-02-13', 'values': 38.0}, {'dates': '2017-02-14', 'values': 29.0}, {'dates': '2017-02-15', 'values': 26.0}, {'dates': '2017-02-16', 'values': 27.0}, {'dates': '2017-02-17', 'values': 37.0}, {'dates': '2017-02-18', 'values': 34.0}, {'dates': '2017-02-19', 'values': 47.0}, {'dates': '2017-02-20', 'values': 39.0}, {'dates': '2017-02-21', 'values': 25.0}, {'dates': '2017-02-22', 'values': 38.0}, {'dates': '2017-02-23', 'values': 32.0}, {'dates': '2017-02-24', 'values': 25.0}, {'dates': '2017-02-25', 'values': 63.0}, {'dates': '2017-02-26', 'values': 39.0}, {'dates': '2017-02-27', 'values': 27.0}]}, {'term': 'elephant', 'points': [{'dates': '2016-12-31', 'values': 24.0}, {'dates': '2017-01-01', 'values': 20.0}, {'dates': '2017-01-02', 'values': 20.0}, {'dates': '2017-01-03', 'values': 20.0}, {'dates': '2017-01-04', 'values': 0.0}, {'dates': '2017-01-05', 'values': 0.0}, {'dates': '2017-01-06', 'values': 23.0}, {'dates': '2017-01-07', 'values': 22.0}, {'dates': '2017-01-08', 'values': 46.0}, {'dates': '2017-01-09', 'values': 19.0}, {'dates': '2017-01-10', 'values': 19.0}, {'dates': '2017-01-11', 'values': 0.0}, {'dates': '2017-01-12', 'values': 19.0}, {'dates': '2017-01-13', 'values': 23.0}, {'dates': '2017-01-14', 'values': 22.0}, {'dates': '2017-01-15', 'values': 19.0}, {'dates': '2017-01-16', 'values': 0.0}, {'dates': '2017-01-17', 'values': 19.0}, {'dates': '2017-01-18', 'values': 29.0}, {'dates': '2017-01-19', 'values': 0.0}, {'dates': '2017-01-20', 'values': 0.0}, {'dates': '2017-01-21', 'values': 0.0}, {'dates': '2017-01-22', 'values': 36.0}, {'dates': '2017-01-23', 'values': 19.0}, {'dates': '2017-01-24', 'values': 19.0}, {'dates': '2017-01-25', 'values': 19.0}, {'dates': '2017-01-26', 'values': 0.0}, {'dates': '2017-01-27', 'values': 0.0}, {'dates': '2017-01-28', 'values': 22.0}, {'dates': '2017-01-29', 'values': 18.0}, {'dates': '2017-01-30', 'values': 19.0}, {'dates': '2017-01-31', 'values': 37.0}, {'dates': '2017-02-01', 'values': 29.0}, {'dates': '2017-02-02', 'values': 20.0}, {'dates': '2017-02-03', 'values': 47.0}, {'dates': '2017-02-04', 'values': 0.0}, {'dates': '2017-02-05', 'values': 28.0}, {'dates': '2017-02-06', 'values': 18.0}, {'dates': '2017-02-07', 'values': 38.0}, {'dates': '2017-02-08', 'values': 28.0}, {'dates': '2017-02-09', 'values': 39.0}, {'dates': '2017-02-10', 'values': 0.0}, {'dates': '2017-02-11', 'values': 23.0}, {'dates': '2017-02-12', 'values': 37.0}, {'dates': '2017-02-13', 'values': 19.0}, {'dates': '2017-02-14', 'values': 39.0}, {'dates': '2017-02-15', 'values': 0.0}, {'dates': '2017-02-16', 'values': 20.0}, {'dates': '2017-02-17', 'values': 24.0}, {'dates': '2017-02-18', 'values': 23.0}, {'dates': '2017-02-19', 'values': 38.0}, {'dates': '2017-02-20', 'values': 0.0}, {'dates': '2017-02-21', 'values': 19.0}, {'dates': '2017-02-22', 'values': 19.0}, {'dates': '2017-02-23', 'values': 64.0}, {'dates': '2017-02-24', 'values': 37.0}, {'dates': '2017-02-25', 'values': 24.0}, {'dates': '2017-02-26', 'values': 29.0}, {'dates': '2017-02-27', 'values': 40.0}]}]}

I've tried appending the dates and values of both subjects to seperate lists, and then plotting with matplot. But I assume there must be a more efficient way using the original structure of the data.

Not sure what you tried in terms of "appending the dates and values of both subjects to separate lists," so apologies if this is repeating what you've already done. But using pd.DataFrame() on both dates / values lists is the natural way to do it. Here's how I'd go about it.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn # optional

data = # THE DATA AS YOU POSTED IT

df1 = pd.DataFrame(data['drawing'][0]['points'])
df2 = pd.DataFrame(data['drawing'][1]['points'])

# Put the two together.
# Simple concat in your specific case since the data
# is already sorted and balanced
df = pd.concat([df1, df2['values']], axis=1)

# column names
df.columns = ['date',
              data['drawing'][0]['subject'],
              data['drawing'][1]['term']] # you use both 'subject' and 'term'

# Need datetime format for ease of plotting
df['date'] = pd.to_datetime(df['date'])


# Then the matplotlib stuff ...
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

ax.plot(df['date'], df[df.columns[1]])
ax.plot(df['date'], df[df.columns[2]])

plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
plt.tight_layout()
plt.legend()

fig.savefig('output.png', dpi=200)

The result: 线形图

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM