Reputation: 67
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.
Upvotes: 1
Views: 1407
Reputation: 1215
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)
Upvotes: 2