I’m trying to plot a rainfall & water flow chart as below:
JavaScript
x
4
1
import pandas as pd
2
import random
3
import matplotlib.pyplot as plt
4
Generate Sample Data
JavaScript
1
19
19
1
date = ['2009/6/12 2:00', '2009/6/12 3:00', '2009/6/12 4:00', '2009/6/12 5:00', '2009/6/12 6:00', '2009/6/12 7:00', '2009/6/12 8:00', '2009/6/12 9:00', '2009/6/12 10:00', '2009/6/12 11:00', '2009/6/12 12:00', '2009/6/12 13:00', '2009/6/12 14:00', '2009/6/12 15:00', '2009/6/12 16:00', '2009/6/12 17:00', '2009/6/12 18:00', '2009/6/12 19:00', '2009/6/12 20:00', '2009/6/12 21:00', '2009/6/12 22:00', '2009/6/12 23:00',
2
'2009/6/13 0:00', '2009/6/13 1:00', '2009/6/13 2:00', '2009/6/13 3:00', '2009/6/13 4:00', '2009/6/13 5:00', '2009/6/13 6:00', '2009/6/13 7:00', '2009/6/13 8:00', '2009/6/13 9:00', '2009/6/13 10:00', '2009/6/13 11:00', '2009/6/13 12:00', '2009/6/13 13:00', '2009/6/13 14:00', '2009/6/13 15:00', '2009/6/13 16:00', '2009/6/13 17:00', '2009/6/13 18:00', '2009/6/13 19:00', '2009/6/13 20:00', '2009/6/13 21:00', '2009/6/13 22:00', '2009/6/13 23:00',
3
'2009/6/14 0:00', '2009/6/14 1:00', '2009/6/14 2:00', '2009/6/14 3:00', '2009/6/14 4:00', '2009/6/14 5:00', '2009/6/14 6:00', '2009/6/14 7:00', '2009/6/14 8:00', '2009/6/14 9:00', '2009/6/14 10:00', '2009/6/14 11:00', '2009/6/14 12:00', '2009/6/14 13:00', '2009/6/14 14:00', '2009/6/14 15:00', '2009/6/14 16:00', '2009/6/14 17:00', '2009/6/14 18:00', '2009/6/14 19:00', '2009/6/14 20:00', '2009/6/14 21:00', '2009/6/14 22:00', '2009/6/14 23:00',
4
'2009/6/15 0:00', '2009/6/15 1:00', '2009/6/15 2:00']
5
6
7
count1 = [random.randrange(1, 50, 1) for i in range(len(date))]
8
count2 = [random.randrange(50, 100, 1) for i in range(len(date))]
9
10
11
data = pd.DataFrame()
12
13
data["Date"] = date
14
data["Count1"] = count1
15
data["Count2"] = count2
16
17
data["Date"] = pd.to_datetime(data["Date"], format="%Y/%m/%d %H:%M")
18
19
Plotting
JavaScript
1
17
17
1
# Draw Plot
2
plt.figure(figsize=(12,6), dpi= 100)
3
plt.plot("Date", "Count", data=data, color='tab:blue', label='Count')
4
5
plt.title("Rainfall & Water Flow Chart", fontsize=12)
6
plt.yticks(fontsize=12, alpha=.7)
7
8
# Lighten borders
9
plt.gca().spines["top"].set_alpha(.0)
10
plt.gca().spines["bottom"].set_alpha(.0)
11
plt.gca().spines["right"].set_alpha(.0)
12
plt.gca().spines["left"].set_alpha(.0)
13
14
# plt.legend(loc='upper left')
15
plt.grid(axis='y', alpha=.3)
16
plt.show()
17
I’m able to plot the top part, not sure how to invert or mirror the line chart. How to plot a Rainfall & Waterflow chart as above?
Advertisement
Answer
In order to create the second plot you have to use a subplot:
JavaScript
1
2
1
fig, ax = plt.subplots(2, 1, figsize=(12,6), dpi= 100)
2
For the second axis, you can invert y axis with:
JavaScript
1
2
1
ax[1].invert_yaxis()
2
Moreover, since x axis is a datetime format, I suggest you to customize it with:
JavaScript
1
5
1
ax[0].xaxis.set_major_locator(md.HourLocator(interval = 12))
2
ax[0].xaxis.set_major_formatter(md.DateFormatter('%m/%d %H:%M'))
3
plt.setp(ax[0].xaxis.get_majorticklabels(), rotation = 0)
4
ax[0].set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
5
Complete Code
JavaScript
1
60
60
1
import pandas as pd
2
import random
3
import matplotlib.pyplot as plt
4
import matplotlib.dates as md
5
6
7
date = ['2009/6/12 2:00', '2009/6/12 3:00', '2009/6/12 4:00', '2009/6/12 5:00', '2009/6/12 6:00', '2009/6/12 7:00', '2009/6/12 8:00', '2009/6/12 9:00', '2009/6/12 10:00', '2009/6/12 11:00', '2009/6/12 12:00', '2009/6/12 13:00', '2009/6/12 14:00', '2009/6/12 15:00', '2009/6/12 16:00', '2009/6/12 17:00', '2009/6/12 18:00', '2009/6/12 19:00', '2009/6/12 20:00', '2009/6/12 21:00', '2009/6/12 22:00', '2009/6/12 23:00',
8
'2009/6/13 0:00', '2009/6/13 1:00', '2009/6/13 2:00', '2009/6/13 3:00', '2009/6/13 4:00', '2009/6/13 5:00', '2009/6/13 6:00', '2009/6/13 7:00', '2009/6/13 8:00', '2009/6/13 9:00', '2009/6/13 10:00', '2009/6/13 11:00', '2009/6/13 12:00', '2009/6/13 13:00', '2009/6/13 14:00', '2009/6/13 15:00', '2009/6/13 16:00', '2009/6/13 17:00', '2009/6/13 18:00', '2009/6/13 19:00', '2009/6/13 20:00', '2009/6/13 21:00', '2009/6/13 22:00', '2009/6/13 23:00',
9
'2009/6/14 0:00', '2009/6/14 1:00', '2009/6/14 2:00', '2009/6/14 3:00', '2009/6/14 4:00', '2009/6/14 5:00', '2009/6/14 6:00', '2009/6/14 7:00', '2009/6/14 8:00', '2009/6/14 9:00', '2009/6/14 10:00', '2009/6/14 11:00', '2009/6/14 12:00', '2009/6/14 13:00', '2009/6/14 14:00', '2009/6/14 15:00', '2009/6/14 16:00', '2009/6/14 17:00', '2009/6/14 18:00', '2009/6/14 19:00', '2009/6/14 20:00', '2009/6/14 21:00', '2009/6/14 22:00', '2009/6/14 23:00',
10
'2009/6/15 0:00', '2009/6/15 1:00', '2009/6/15 2:00']
11
12
13
data = pd.DataFrame({'Date': date,
14
'Count1': [random.randrange(1, 50, 1) for i in range(len(date))],
15
'Count2': [random.randrange(50, 100, 1) for i in range(len(date))]})
16
17
data["Date"] = pd.to_datetime(data["Date"], format="%Y/%m/%d %H:%M")
18
19
20
fig, ax = plt.subplots(2, 1, figsize=(12,6), dpi= 100)
21
22
ax[0].plot("Date", "Count1", data=data, color='tab:blue', label='Count')
23
24
ax[0].set_title("Rainfall & Water Flow Chart", fontsize=12)
25
26
ax[0].spines["top"].set_alpha(.0)
27
ax[0].spines["bottom"].set_alpha(.0)
28
ax[0].spines["right"].set_alpha(.0)
29
ax[0].spines["left"].set_alpha(.0)
30
31
ax[0].legend(loc='upper left')
32
ax[0].grid(axis='y', alpha=.3)
33
34
ax[0].xaxis.set_major_locator(md.HourLocator(interval = 12))
35
ax[0].xaxis.set_major_formatter(md.DateFormatter('%m/%d %H:%M'))
36
plt.setp(ax[0].xaxis.get_majorticklabels(), rotation = 0)
37
ax[0].set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
38
39
ax[1].plot("Date", "Count2", data=data, color='tab:green', label='Count')
40
ax[1].invert_yaxis()
41
42
ax[1].spines["top"].set_alpha(.0)
43
ax[1].spines["bottom"].set_alpha(.0)
44
ax[1].spines["right"].set_alpha(.0)
45
ax[1].spines["left"].set_alpha(.0)
46
47
ax[1].legend(loc='upper left')
48
ax[1].grid(axis='y', alpha=.3)
49
50
ax[1].xaxis.set_major_locator(md.HourLocator(interval = 12))
51
ax[1].xaxis.set_major_formatter(md.DateFormatter('%m/%d %H:%M'))
52
plt.setp(ax[1].xaxis.get_majorticklabels(), rotation = 0)
53
ax[1].set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
54
55
ax[1].tick_params(bottom = False, labelbottom = False, top = True, labeltop = True)
56
57
plt.tight_layout()
58
59
plt.show()
60