我正在尝试创建一个与所附图像类似的图表。
我计划使用 matplotlib,但我不确定要使用哪种类型的图表。
底部的图表显示了人们进出公交车的情况。 顶部的图表显示了特定时间的门打开和关闭。
该图表是根据 csv 文件构建的,其中包含门事件时间戳和计数事件时间戳。
目前,我正在考虑对底部图表使用 plot() 函数,对顶部图表使用 bar() 函数。
你认为这可行吗?我应该使用其他东西吗?
另外,您认为我应该使用 plt.subplot() 来绘制这两个图表,还是应该将它们绘制在同一个图表上?
任何例子都很好。
感谢您的宝贵时间, ssinfod
最佳答案
我喜欢 @jcoppens 的 axhspan 想法。这是一个在顶部使用 bar
并在主图上使用 step
的示例。顶部条形图对应于底部的橙色step
图,绿色条形图也类似。
条形图中的橙色或绿色 map 对应于进来的人数(由相关步骤
图中的正值确定 - 相关我指的是绿色与绿色,橙色与橙子)。灰度对应于人们外出(由相关阶梯图中的负值确定)。
生成绘图的代码:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.colors as col
hr = ['{num:02d}'.format(num=i) for i in range(24)]
times = ['{0}:00'.format(h) for h in hr ]
tick_location = [t*4 for t in range(24)]
x1 = np.random.randint(-10, 20, 4*24)
x1[0:5] = 0
x1[20:30] = 0
x1[42:57] = 0
x1[69:74] = 0
x2 = np.random.randint(-3, 5, 4*24)
x2[0:25] = 0
x2[48:57] = 0
x2[89:] = 0
你真正关心的是:
cmap_in_x1 = cm.ScalarMappable(col.Normalize(min(x1), max(x1)), 'Greens')
cmap_in_x2 = cm.ScalarMappable(col.Normalize(min(x2), max(x2)), 'Oranges')
cmap_out = cm.ScalarMappable(col.Normalize(min(x1), max(x1)), 'bone')
fig = plt.figure(figsize=(12,8))
big_ax = fig.add_axes([0.1, 0.1, 0.8, 0.6])
plt.grid()
small_ax_1 = fig.add_axes([0.1, 0.7, 0.8, 0.05], sharex=big_ax)
small_ax_2 = fig.add_axes([0.1, 0.75, 0.8, 0.05], sharex=big_ax)
big_ax.step(np.arange(len(x1)), x1, color='lightgreen', alpha=0.8, linewidth=2)
big_ax.step(np.arange(len(x2)), x2, color='orange', alpha=0.5, linewidth=2)
small_ax_1.bar(np.arange(len(x1>0)), x1>0, align='center', alpha=0.8, color=cmap_in_x1.to_rgba(x1))
small_ax_1.bar(np.arange(len(x1<0)), x1<0, align='center', alpha=1.0, color=cmap_out.to_rgba(x1))
small_ax_2.bar(np.arange(len(x2>0)), x2>0, align='center', alpha=0.8, color=cmap_in_x2.to_rgba(x2))
small_ax_2.bar(np.arange(len(x2<0)), x2<0, align='center', alpha=1.0, color=cmap_out.to_rgba(x2))
big_ax.set_xticks(tick_location)
big_ax.set_xticklabels(times, rotation=90)
big_ax.plot(np.zeros(len(x1)), color='black', linewidth=2)
plt.setp(small_ax_1.get_yticklabels(), visible=False)
plt.setp(small_ax_1.get_xticklabels(), visible=False)
plt.setp(small_ax_2.get_yticklabels(), visible=False)
plt.setp(small_ax_2.get_xticklabels(), visible=False)
plt.title('Bus Traffic', fontsize=24)
plt.show()
关于python - matplotlib:双图表(情节和事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30448890/