How to create an area plot with a line and another line on a secondary y

Viewed 83

I have 4 lists which I want to plot on the same graph. 3 of the 4 share the same scale while the x axis values are the same across all 4. I'd like to plot for each x date value and have it show on the plot.

These are my lists:

date_list = [datetime.date(2008, 1, 1), datetime.date(2008, 2, 1), datetime.date(2008, 3, 1), datetime.date(2008, 4, 1), datetime.date(2008, 5, 1), datetime.date(2008, 7, 1), datetime.date(2009, 7, 1), datetime.date(2010, 7, 1), datetime.date(2010, 8, 1), datetime.date(2010, 9, 1), datetime.date(2010, 10, 1), datetime.date(2010, 11, 1), datetime.date(2010, 12, 1), datetime.date(2011, 1, 1), datetime.date(2011, 2, 1), datetime.date(2011, 3, 1), datetime.date(2011, 4, 1), datetime.date(2011, 5, 1), datetime.date(2011, 6, 1), datetime.date(2011, 7, 1), datetime.date(2011, 10, 1), datetime.date(2011, 11, 1), datetime.date(2011, 12, 1), datetime.date(2012, 1, 1), datetime.date(2012, 2, 1), datetime.date(2012, 10, 1), datetime.date(2012, 11, 1), datetime.date(2012, 12, 1), datetime.date(2013, 1, 1), datetime.date(2013, 2, 1), datetime.date(2013, 8, 1), datetime.date(2013, 11, 1), datetime.date(2013, 12, 1), datetime.date(2014, 1, 1), datetime.date(2014, 2, 1), datetime.date(2014, 3, 1), datetime.date(2014, 4, 1), datetime.date(2014, 5, 1), datetime.date(2014, 6, 1), datetime.date(2014, 7, 1), datetime.date(2015, 2, 1), datetime.date(2015, 3, 1), datetime.date(2015, 4, 1), datetime.date(2015, 5, 1), datetime.date(2015, 6, 1), datetime.date(2015, 7, 1), datetime.date(2015, 8, 1), datetime.date(2015, 9, 1), datetime.date(2015, 10, 1), datetime.date(2015, 11, 1), datetime.date(2015, 12, 1), datetime.date(2016, 1, 1), datetime.date(2016, 2, 1), datetime.date(2016, 3, 1), datetime.date(2016, 4, 1), datetime.date(2016, 5, 1), datetime.date(2016, 6, 1), datetime.date(2016, 7, 1), datetime.date(2016, 8, 1), datetime.date(2016, 9, 1), datetime.date(2016, 10, 1), datetime.date(2016, 11, 1), datetime.date(2016, 12, 1), datetime.date(2017, 1, 1), datetime.date(2017, 2, 1), datetime.date(2017, 3, 1), datetime.date(2017, 4, 1), datetime.date(2017, 5, 1), datetime.date(2017, 6, 1), datetime.date(2017, 7, 1), datetime.date(2017, 8, 1), datetime.date(2017, 9, 1), datetime.date(2017, 10, 1), datetime.date(2017, 11, 1), datetime.date(2017, 12, 1), datetime.date(2018, 1, 1), datetime.date(2018, 2, 1), datetime.date(2018, 3, 1), datetime.date(2018, 4, 1), datetime.date(2018, 5, 1), datetime.date(2018, 6, 1), datetime.date(2018, 7, 1), datetime.date(2018, 8, 1), datetime.date(2018, 9, 1), datetime.date(2018, 10, 1), datetime.date(2018, 11, 1), datetime.date(2018, 12, 1), datetime.date(2019, 1, 1), datetime.date(2019, 2, 1), datetime.date(2019, 3, 1), datetime.date(2019, 4, 1), datetime.date(2019, 5, 1), datetime.date(2019, 6, 1), datetime.date(2019, 7, 1), datetime.date(2019, 8, 1), datetime.date(2019, 9, 1), datetime.date(2019, 10, 1), datetime.date(2019, 11, 1), datetime.date(2019, 12, 1), datetime.date(2020, 1, 1), datetime.date(2020, 2, 1), datetime.date(2020, 3, 1), datetime.date(2020, 4, 1), datetime.date(2020, 5, 1), datetime.date(2020, 6, 1), datetime.date(2020, 7, 1), datetime.date(2020, 8, 1), datetime.date(2020, 9, 1), datetime.date(2020, 10, 1), datetime.date(2020, 11, 1), datetime.date(2020, 12, 1)]

w = [318.5, 1195.6, 1174.1, 317.2, 1453.9, 1274.2, 499.9, 690.2, 247.9, 623.9, 719.8, 462.1, 591.7, 662.4, 530.6, 1225.0, 1190.5, 1474.0, 734.8, 650.2, 701.0, 1028.7, 348.8, 273.8, 1028.8, 1244.0, 1546.9, 689.0, 415.3, 1406.5, 623.1, 826.6, 1106.5, 1228.0, 1474.2, 625.5, 670.0, 1459.2, 1294.8, 432.5, 1472.4, 1124.2, 584.3, 1329.5, 219.5, 1156.4, 1524.4, 1039.2, 790.7, 407.7, 907.4, 885.7, 858.0, 1133.9, 469.6, 801.1, 995.1, 1271.9, 821.8, 250.3, 289.2, 1478.2, 1417.8, 1325.8, 853.3, 415.7, 1393.9, 829.6, 390.2, 985.1, 581.1, 770.5, 588.4, 1522.3, 580.1, 800.1, 558.1, 1500.1, 418.6, 1520.2, 1414.8, 648.9, 907.5, 1205.4, 773.7, 210.5, 1443.9, 956.2, 488.0, 678.8, 648.8, 1018.5, 1046.2, 1160.1, 479.4, 891.7, 1400.7, 696.0, 555.5, 614.1, 1451.7, 1038.4, 261.7, 718.2, 1186.9, 498.8, 793.4, 1194.3, 929.0, 304.8, 1029.4]

x = [3193.1, 3934.2, 2775.9, 4295.0, 2627.2, 3803.7, 4412.7, 3954.2, 2756.1, 4167.6, 3752.2, 4460.3, 5452.4, 5062.5, 4981.4, 2971.5, 3721.2, 2568.0, 3676.2, 4690.1, 3312.4, 5391.4, 3606.8, 3967.0, 4424.4, 2606.8, 5325.3, 3492.1, 3490.6, 4944.7, 3538.7, 4388.4, 4570.3, 4595.6, 2628.3, 4354.3, 3675.1, 2569.8, 3603.6, 3583.0, 4501.8, 2747.1, 4502.0, 3120.8, 4045.2, 4222.6, 4582.9, 4410.9, 4816.2, 4420.7, 3813.9, 2514.1, 2576.5, 4330.4, 3852.9, 3018.0, 3870.0, 3880.7, 5403.7, 4598.0, 4570.6, 4372.3, 4897.3, 4957.4, 4068.6, 2604.1, 4414.7, 2756.3, 3948.1, 2504.6, 3844.0, 3109.8, 4241.5, 2630.4, 3626.9, 2772.9, 3346.9, 4940.6, 4686.7, 2555.1, 4010.9, 4433.4, 5442.0, 2667.9, 4936.7, 4960.8, 4887.6, 4809.1, 2954.1, 3354.5, 5401.4, 3825.5, 2904.6, 4961.5, 3501.3, 2762.0, 2582.7, 3236.6, 5377.4, 4200.7, 3845.9, 4401.4, 3260.5, 4078.6, 3221.2, 3801.5, 4122.8, 5317.4, 3952.7, 3376.1, 3322.6]

y = [5111.4, 1024.2, 626.9, 4169.6, 4596.8, 2673.1, 512.4, 3669.0, 5283.4, 543.9, 3582.7, 1202.4, 769.0, 4277.2, 2170.2, 1685.3, 3798.6, 2626.8, 3008.5, 3336.4, 5360.8, 3765.7, 4313.1, 4678.8, 2354.3, 2819.1, 622.6, 185.3, 5129.2, 4907.7, 816.5, 1432.7, 3746.6, 1419.7, 4330.9, 3877.5, 2025.9, 4570.3, 751.0, 2299.0, 1157.9, 1450.8, 3930.4, 3574.1, 2871.9, 4729.0, 2880.7, 4985.4, 4422.2, 4480.3, 2887.5, 1960.5, 2367.5, 1876.1, 3832.4, 4072.7, 1827.8, 1780.8, 3660.0, 2372.4, 2353.7, 5203.9, 1124.5, 3463.2, 3369.3, 1745.2, 2427.7, 1306.0, 1222.2, 1845.8, 2735.2, 5111.0, 1550.0, 4889.4, 4862.7, 4989.6, 3881.9, 3179.3, 1179.3, 1328.5, 2661.7, 5187.1, 4981.0, 1547.9, 348.5, 2981.7, 5031.3, 3711.4, 2548.3, 2953.6, 455.6, 3282.8, 2021.3, 1494.2, 1731.6, 536.0, 2025.0, 419.9, 976.8, 4353.2, 4578.3, 359.8, 3963.8, 1139.6, 4463.0, 5193.6, 3992.5, 2992.7, 2968.7, 4641.9, 4622.6]

z = [0.0, 45.0, 20.0, 10.0, 10.0, 40.0, 25.0, 35.0, 20.0, 40.0, 15.0, 5.0, 10.0, 25.0, 20.0, 40.0, 45.0, 5.0, 15.0, 15.0, 0.0, 30.0, 40.0, 40.0, 10.0, 15.0, 10.0, 45.0, 20.0, 25.0, 30.0, 10.0, 10.0, 0.0, 10.0, 15.0, 25.0, 20.0, 0.0, 30.0, 40.0, 15.0, 45.0, 45.0, 40.0, 40.0, 40.0, 45.0, 15.0, 0.0, 30.0, 45.0, 0.0, 40.0, 0.0, 40.0, 5.0, 30.0, 20.0, 5.0, 10.0, 35.0, 20.0, 45.0, 10.0, 0.0, 20.0, 25.0, 30.0, 25.0, 40.0, 10.0, 15.0, 20.0, 0.0, 10.0, 5.0, 45.0, 20.0, 10.0, 45.0, 5.0, 45.0, 5.0, 15.0, 0.0, 40.0, 35.0, 15.0, 20.0, 10.0, 25.0, 10.0, 20.0, 5.0, 45.0, 40.0, 10.0, 10.0, 5.0, 35.0, 30.0, 10.0, 45.0, 15.0, 5.0, 30.0, 45.0, 10.0, 35.0, 15.0]

The lists w, x and y are to be on the same scale while z is on a different scale from range 0 to 100. Attached is a picture of what I'm trying to reproduce.

This is my attempt thus far:

import datetime

import matplotlib.pyplot as plt

fig,ax=plt.subplots(figsize = (100, 50))

ax.stackplot(date_list, y, x,colors = ["r", "skyblue"],  alpha=0.8)
ax.plot(date_list, w,lw = 2.5, color = "g")
ax.set_yticklabels(y, fontsize=50)
ax.set_xticklabels(date_list, fontsize = 50)


ax2=ax.twinx()
ax2.plot(date_list, z, color = 'b')

ax.legend(loc=2, fontsize='large')
ax2.legend(loc=3, fontsize='large')
plt.show()

z = blue, w = green, x = red and y = grey

image of what I am trying to reproduce

1 Answers
  • The easiest way to accomplish this is probably to load the data into a pandas.DataFrame and then to plot with pandas.DataFrame.plot
  • If you want all the existing dates as x-ticks, then replace p3 with the following, and increase figsize=, but it's likely to overcrowd the x-axis.
    • df.plot(y='z', ax=ax, secondary_y=True, color='blue', xticks=df.index, rot=90)
import pandas as pd

# create dataframe
df = pd.DataFrame({'w': w, 'x': x, 'y': y, 'z': z}, index=date_list)

# plot the areas
ax = df.plot(kind='area', y=['x', 'y'], figsize=(15, 7), color=['red', 'lightsteelblue'])

# plot the line on the same y
p2 = df.plot(y='w', ax=ax, color='green')

# plot the line on a secondary y
p3 = df.plot(y='z', ax=ax, secondary_y=True, color='blue')

enter image description here

Related