本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:【示例】餐厅定位应用 Open Table 公布的疫情期间餐厅预约数据可视化
原帖网址为:https://verimake.com/topics/65 (旧版论坛网址,已失效)
原帖作者为:YX(旧版论坛 id = 22,注册于 2020-04-06 23:28:45)
原帖由作者初次发表于 2020-04-07 16:34:04,最后编辑于 2020-04-07 16:34:04(编辑时间可能不准确)
截至 2021-12-18 14:27:30 备份数据库时,原帖已获得 1103 次浏览、2 个点赞、0 条回复
微博上有一个博主@yiqin_fu
前段时间分享了一组由餐厅定位应用Open Table
公布的2-3月期间部分餐厅的预约数据,@yiqin_fu
选择了西雅图、旧金山、纽约和波士顿四个程师的用餐人数画了一张图,如下:

感觉是个挺不错的学习数据可视化的案例,接下来我们用python
尝试画一下这个图。
import pandas as pd
from datetime import datetime, timedelta
# 数据下载之后命名为R.xlsx,header=None是因为默认header=0,但处理不好第一行的时间数据
df = pd.read_excel('R.xlsx',index_col=0,header=None)
# 处理第一行数据,转成时间序列
df.iloc[0,:] = pd.to_datetime(df.iloc[0,:]-2,unit='D',origin=pd.Timestamp('1900-01-01'),dayfirst=True)
df.columns = df.iloc[0,:]
# 去掉第一行
df = df.iloc[1:,:]
# 测试取数据
df['2020-02-18']
df.columns.name = None
df.index.name = None
# 查看columns
df.columns
DatetimeIndex(['2020-02-18', '2020-02-19', '2020-02-20', '2020-02-21',
'2020-02-22', '2020-02-23', '2020-02-24', '2020-02-25',
'2020-02-26', '2020-02-27', '2020-02-28', '2020-02-29',
'2020-03-01', '2020-03-02', '2020-03-03', '2020-03-04',
'2020-03-05', '2020-03-06', '2020-03-07', '2020-03-08',
'2020-03-09', '2020-03-10', '2020-03-11', '2020-03-12',
'2020-03-13', '2020-03-14'],dtype='datetime64[ns]', freq=None)
%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
import matplotlib.dates as mdate
fig1 = plt.figure(figsize=(12,6),dpi=80)
ax1 = fig1.add_subplot(1,1,1)
# 配置横坐标为日期格式
ax1.xaxis.set_major_formatter(mdate.DateFormatter('%m-%d'))
plt.plot(df.loc['Canada',:]*100,label='Canada')
plt.plot(df.loc['Mexico',:]*100,label='Mexico')
# 配置横坐标的刻度,并旋转
plt.xticks(pd.date_range('2020-02-18','2020-03-14',freq='2D'),rotation=20)
plt.title('YoY Change in the Number of Restaurant Dinner (%)')
#plt.legend()
# 配置标注
ax1.annotate('Canada',xy=('2020-02-18',df.loc['Canada','2020-02-18']*100),xycoords='data',bbox=dict(boxstyle='round',fc='none',ec='gray'),xytext=(5,-10),textcoords='offset points',ha='center')
ax1.annotate('Mexico',xy=('2020-02-18',df.loc['Mexico','2020-02-18']*100),xycoords='data',bbox=dict(boxstyle='round',fc='none',ec='orange'),xytext=(5,-10),textcoords='offset points',ha='center')

matplotlib
关于annotate
使用方法的说明文档
原始数据:数据链接