首页 > 解决方案 > 如何在 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()

我能够绘制顶部,不知道如何反转或镜像折线图。如何绘制如上的降雨和水流图?

标签: pythondatetimematplotlibplotdata-visualization

解决方案


为了创建第二个图,您必须使用子图:

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()

在此处输入图像描述


推荐阅读