python - matplotlib:双图表(情节和事件)

标签 python matplotlib charts

我正在尝试创建一个与所附图像类似的图表。 enter image description here

我计划使用 matplotlib,但我不确定要使用哪种类型的图表。

底部的图表显示了人们进出公交车的情况。 顶部的图表显示了特定时间的门打开和关闭。

该图表是根据 csv 文件构建的,其中包含门事件时间戳和计数事件时间戳。

目前,我正在考虑对底部图表使用 plot() 函数,对顶部图表使用 bar() 函数。

你认为这可行吗?我应该使用其他东西吗?

另外,您认为我应该使用 plt.subplot() 来绘制这两个图表,还是应该将它们绘制在同一个图表上?

任何例子都很好。

感谢您的宝贵时间, ssinfod

最佳答案

我喜欢 @jcoppens 的 axhspan 想法。这是一个在顶部使用 bar 并在主图上使用 step 的示例。顶部条形图对应于底部的橙色step图,绿色条形图也类似。

条形图中的橙色或绿色 map 对应于进来的人数(由相关步骤图中的正值确定 - 相关我指的是绿色与绿色,橙色与橙子)。灰度对应于人们外出(由相关阶梯图中的负值确定)。

enter image description here

生成绘图的代码:

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/

相关文章:

python - 如何迭代 CSV 文件并将其绘制为箱线图,每列代表 Python 中的一秒?

vba - 使用 VBA 的图表绝对位置

javascript - 在 Google 圆环图中隐藏切片

linux - Linux下应该使用什么库来生成热图?

Python 多处理将命令传递给进程/池/队列?

python - 格式说明符未被从 python 传递到 mysql 的选择查询中的值替换

python - 在 matplotlib 中改变寄生虫轴的颜色

Python:按数组长度对二维数组进行排序?

python - Django 自动为任意管理表单生成 POST 数据字典

python - Matplotlib 直方图与高值收集箱