日历热图通过将事件聚合到日历网格中进行可视化分析,针对时序类数据特征较为直观,其中以github代码热图而知名。
基于plotly_calplot
import pandas as pd
import numpy as np
from plotly_calplot import calplot
# 自定义数据
dt = pd.date_range('2022-09-01', '2023-10-15')
values = np.random.randint(0, 100, len(dt))
df = pd.DataFrame({"dt": dt, "value": values})
# 绘制图形
fig = calplot(
df,
x="dt",
y="value"
)
fig.show()
基于pyecharts
import pandas as pd
import numpy as np
from pyecharts import options as opts
from pyecharts.charts import Calendar
import datetime
import random
# 自定义数据
begin = datetime.date(2022, 1, 1)
end = datetime.date(2022, 12, 31)
data = [
[str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)]
for i in range((end - begin).days + 1)
]
c = (
Calendar()
.add("", data, calendar_opts=opts.CalendarOpts(range_="2022"))
.set_global_opts(
title_opts=opts.TitleOpts(title="2022年微信步数情况"),
visualmap_opts=opts.VisualMapOpts(
max_=30000,
min_=500,
orient="horizontal",
is_piecewise=True,
pos_top="230px",
pos_left="100px",
),
)
)
c.render_notebook()
基于calplot
import numpy as np
import pandas as pd
import calplot
import matplotlib.pyplot as plt
# 自定义数据
np.random.seed(sum(map(ord, 'calplot')))
all_days = pd.date_range('1/1/2019', periods=730, freq='D')
days = np.random.choice(all_days, 500)
events = pd.Series(np.random.randn(len(days)), index=days)
calplot.calplot(events, cmap='YlGn', figsize = (16, 8), colorbar=False)
plt.show()
基于july
import numpy as np
import matplotlib.pyplot as plt
import july
from july.utils import date_range
# 自定义数据
dates_2022 = date_range("2022-01-01", "2022-12-31")
data_2022 = np.random.randint(0, 14, len(dates_2022))
dates_2023 = date_range("2023-01-01", "2023-12-31")
data_2023 = np.random.randint(0, 14, len(dates_2023))
july.heatmap(dates_2022, data_2022, title='Github Activity', cmap="github")
july.heatmap(dates_2023, data_2023, cmap="github")
plt.show()
自定义日历热图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
按月绘制
import numpy as np
import matplotlib.pyplot as plt
import july
from july.utils import date_range
# 自定义数据
dates = date_range("2022-01-01", "2022-12-31")
data = np.random.randint(0, 14, len(dates))
july.calendar_plot(dates, data)
plt.show()
指定月份绘制
import numpy as np
import matplotlib.pyplot as plt
import july
from july.utils import date_range
# 自定义数据
dates = date_range("2022-01-01", "2022-12-31")
data = np.random.randint(0, 14, len(dates))
# 初始化布局
fig, axes = plt.subplots(1, 2)
# 带有日期标签
july.month_plot(dates, data, month=5, date_label=True, ax=axes[0])
axes[0].set_title('with date label')
# 带有数值标签
july.month_plot(dates, data, month=5, value_label=True, ax=axes[1])
axes[1].set_title('with value label')
plt.subplots_adjust(wspace=0.5) # 增加子图之间的水平间隔
plt.show()
以上通过plotly_calplot、pyecharts、calplot和july快速绘制日历热图。并通过修改参数或者辅以其他绘图知识自定义各种各样的日历热图来适应相关使用场景。
共勉~