如何从Pandas DataFrame创建活动图(如GitHub贡献图)
大家都知道这个图表:
这个图表展示了一周中的某一天和一年中的某个月,以及一些活动的情况。假设我有这样一个Pandas数据框:
In [87]: metadf2[['Week','Activity']]
Out[87]:
Week Activity
weekday
0 15 1.6
0 15 1.1
0 17 0.6
0 17 0.8
0 17 1.3
0 17 2.6
0 17 0.9
0 19 1.0
0 19 8.0
0 19 1.6
0 23 5.0
0 23 1.2
0 23 0.6
0 23 5.6
1 15 1.6
1 15 0.2
1 15 0.1
1 15 0.1
1 15 0.4
1 17 12.2
1 19 10.2
1 19 1.6
2 13 1.7
2 14 0.0
2 14 0.0
2 15 6.9
2 15 2.5
2 15 5.5
2 17 6.2
2 17 1.3
... ... ...
3 14 1.1
3 14 4.9
3 14 4.0
3 14 1.5
3 14 3.9
4 14 0.2
5 15 5.4
5 15 5.1
5 18 9.5
5 18 8.8
5 20 108.8
5 20 11.1
5 20 11.2
6 13 74.9
6 13 2.0
6 13 3.2
6 13 2.0
6 13 16.7
6 13 5.5
6 16 0.4
6 15 7.6
6 15 11.7
6 15 25.8
6 16 0.4
6 16 0.4
6 16 1.3
6 20 2.0
6 20 20.5
6 20 77.0
6 20 32.8
那么,如何用Matplotlib创建一个类似于Github活动的图表呢?我觉得使用带有nearest
的等高线图是个不错的方向,对吧?
1 个回答
14
这里有一个可以让你开始的例子:
import pylab as pl
import numpy as np
import pandas as pd
# prepare some random data
N = 100
np.random.seed(0)
weekday = np.random.randint(0, 7, N)
week = np.random.randint(0, 40, N)
activity = np.random.randint(0, 100, N)
df = pd.DataFrame({"weekday":weekday, "week":week, "activity":activity})
df.drop_duplicates(subset=["weekday", "week"], inplace=True)
# reshape the data and plot it
df2 = df.pivot(columns="week", index="weekday", values="activity")
df2.fillna(0, inplace=True)
Weekday, Week = np.mgrid[:df2.shape[0]+1, :df2.shape[1]+1]
fig, ax = pl.subplots(figsize=(12, 4))
ax.set_aspect("equal")
pl.pcolormesh(Week, Weekday, df2.values, cmap="Greens", edgecolor="w", vmin=-10, vmax=100)
pl.xlim(0, df2.shape[1])
输出结果是: