绘制水文图 - 降水图

时间:2014-01-28 10:27:38

标签: python numpy matplotlib plot

我想要绘制两个numpy数组:

runoff = np.array([1,4,5,6,7,8,9]) 
precipitation = np.array([4,5,6,7,3,3,7])

降水阵列应该从顶部作为条形。径流作为图底部的线。两者都必须在左侧和右侧具有不同的轴。有点难以描述这个情节,所以我只是添加一个我用谷歌图片搜索的情节链接。

Universtity of Jena, Hydrograph plot

我可以用R做,但我想用matplotlib模块学习它,现在我有点卡住...

3 个答案:

答案 0 :(得分:2)

这是一个想法:

import matplotlib.pyplot as plt
import numpy as np

runoff = np.array([1,4,5,6,7,8,9]) 
precipitation = np.array([4,5,6,7,3,3,7])


fig, ax = plt.subplots()

# x axis to plot both runoff and precip. against
x = np.linspace(0, 10, len(runoff))

ax.plot(x, runoff, color="r")

# Create second axes, in order to get the bars from the top you can multiply 
# by -1
ax2 = ax.twinx()
ax2.bar(x, -precipitation, 0.1)

# Now need to fix the axis labels
max_pre = max(precipitation)
y2_ticks = np.linspace(0, max_pre, max_pre+1)
y2_ticklabels = [str(i) for i in y2_ticks]
ax2.set_yticks(-1 * y2_ticks)
ax2.set_yticklabels(y2_ticklabels)

plt.show()

enter image description here

肯定有更好的方法可以做到这一点,从@ Pierre_GM的答案来看,似乎有一种现成的方式可能更好。

答案 1 :(得分:1)

如果您不介意阅读代码并自行解决: http://hydroclimpy.sourceforge.net/plotlib.flows.html#plotting-hydrographs

请注意,不再支持scikits.timeseriesscikits.hydroclimpy也不支持。因此,它不是一个关键的解决方案。 不过,阅读代码应该会给你一些想法。

答案 2 :(得分:0)

@Greg Greg的回答很好。但是,通常不需要反转y轴并手动固定轴标签。只需在Greg的答案中替换以下代码

# Now need to fix the axis labels
max_pre = max(precipitation)
y2_ticks = np.linspace(0, max_pre, max_pre+1)
y2_ticklabels = [str(i) for i in y2_ticks]
ax2.set_yticks(-1 * y2_ticks)
ax2.set_yticklabels(y2_ticklabels)

单行代码:

plt.gca().invert_yaxis()