python - 如何在 Python 中绘制降雨和水流图?
问题描述
我正在尝试绘制如下降雨和水流图:
import pandas as pd
import random
import matplotlib.pyplot as plt
生成样本数据
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',
'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',
'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',
'2009/6/15 0:00', '2009/6/15 1:00', '2009/6/15 2:00']
count1 = [random.randrange(1, 50, 1) for i in range(len(date))]
count2 = [random.randrange(50, 100, 1) for i in range(len(date))]
data = pd.DataFrame()
data["Date"] = date
data["Count1"] = count1
data["Count2"] = count2
data["Date"] = pd.to_datetime(data["Date"], format="%Y/%m/%d %H:%M")
绘图
# Draw Plot
plt.figure(figsize=(12,6), dpi= 100)
plt.plot("Date", "Count", data=data, color='tab:blue', label='Count')
plt.title("Rainfall & Water Flow Chart", fontsize=12)
plt.yticks(fontsize=12, alpha=.7)
# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.0)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.0)
# plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.show()
我能够绘制顶部,不知道如何反转或镜像折线图。如何绘制如上的降雨和水流图?
解决方案
为了创建第二个图,您必须使用子图:
fig, ax = plt.subplots(2, 1, figsize=(12,6), dpi= 100)
对于第二个轴,您可以使用以下方法反转 y 轴:
ax[1].invert_yaxis()
此外,由于 x 轴是日期时间格式,我建议您自定义它:
ax[0].xaxis.set_major_locator(md.HourLocator(interval = 12))
ax[0].xaxis.set_major_formatter(md.DateFormatter('%m/%d %H:%M'))
plt.setp(ax[0].xaxis.get_majorticklabels(), rotation = 0)
ax[0].set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
完整代码
import pandas as pd
import random
import matplotlib.pyplot as plt
import matplotlib.dates as md
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',
'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',
'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',
'2009/6/15 0:00', '2009/6/15 1:00', '2009/6/15 2:00']
data = pd.DataFrame({'Date': date,
'Count1': [random.randrange(1, 50, 1) for i in range(len(date))],
'Count2': [random.randrange(50, 100, 1) for i in range(len(date))]})
data["Date"] = pd.to_datetime(data["Date"], format="%Y/%m/%d %H:%M")
fig, ax = plt.subplots(2, 1, figsize=(12,6), dpi= 100)
ax[0].plot("Date", "Count1", data=data, color='tab:blue', label='Count')
ax[0].set_title("Rainfall & Water Flow Chart", fontsize=12)
ax[0].spines["top"].set_alpha(.0)
ax[0].spines["bottom"].set_alpha(.0)
ax[0].spines["right"].set_alpha(.0)
ax[0].spines["left"].set_alpha(.0)
ax[0].legend(loc='upper left')
ax[0].grid(axis='y', alpha=.3)
ax[0].xaxis.set_major_locator(md.HourLocator(interval = 12))
ax[0].xaxis.set_major_formatter(md.DateFormatter('%m/%d %H:%M'))
plt.setp(ax[0].xaxis.get_majorticklabels(), rotation = 0)
ax[0].set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
ax[1].plot("Date", "Count2", data=data, color='tab:green', label='Count')
ax[1].invert_yaxis()
ax[1].spines["top"].set_alpha(.0)
ax[1].spines["bottom"].set_alpha(.0)
ax[1].spines["right"].set_alpha(.0)
ax[1].spines["left"].set_alpha(.0)
ax[1].legend(loc='upper left')
ax[1].grid(axis='y', alpha=.3)
ax[1].xaxis.set_major_locator(md.HourLocator(interval = 12))
ax[1].xaxis.set_major_formatter(md.DateFormatter('%m/%d %H:%M'))
plt.setp(ax[1].xaxis.get_majorticklabels(), rotation = 0)
ax[1].set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
ax[1].tick_params(bottom = False, labelbottom = False, top = True, labeltop = True)
plt.tight_layout()
plt.show()
推荐阅读
- python - 需要从 Python 脚本运行 shell 命令并存储在变量中
- antlr - 词法分析器规则中的冲突
- python - Django密码重置确认不起作用
- java - 在用户离开的上一页码处打开 Pdf
- java - Collections.sort() 不排序单个数字
- node.js - 在 Node 中发出 DELETE 请求时如何修复 [ERR_HTTP_HEADERS_SENT]
- javascript - 收到获取请求后如何显示页面?
- reactjs - 如何在 reactjs 中的 Scroll 上从服务器加载更多内容
- python - 如何在 wfastcgi 中修复“AttributeError: module has no attribute 'wsgi'”
- c# - 如何用操纵杆移动鼠标光标?