「目录」
绘图和可视化
Plotting and Visualization
9.1 => matplotlib
9.2 => pandas和seaborn绘图
-------> 线型图
-------> 柱状图
-------> 直方图和密度图
-------> 散布图或点图
-------> 分面网格(facet grid)和类型数据
柱状图
昨天租了一台Nvidia Tesla A6000,48G的显存,就是要不停续费太烦了
。还记得原来第一次租GPU的时候,把在我的GTX1050上跑的seresnext50换到腾讯云的Tesla V100的时候,那个速度起飞的感觉
,但现在即使换了48GB显存的A6000还是觉得慢,训练一个模型我得等20多个小时,再集成几个的话,感觉钱包。。。,。
如果机器学习是老中医的话,感觉现在深度学习简直就是炼丹啊,比赛里各种奇技淫巧,而且数据集越来越大,模型越来越大,kaggle和Google Colab的羊毛根本不够薅的。
哎,不抱怨了,继续更新pandas的笔记吧。
plot.bar()和plot.barh()会分别绘制水平和垂直的柱状图。
Series和DataFrame的索引将会被用作X轴或Y轴的刻度:
fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax = axes[0], color = 'k', alpha = 0.7)
data.plot.barh(ax = axes[1], color = 'k', alpha = 0.7)复制

上面的color参数设置柱状图的颜色,alpha参数设置透明度。
再来看看对于DataFrame,绘制柱状图的效果吧。
df = pd.DataFrame(np.random.rand(6, 4),
index=['one', 'two', 'three', 'four', 'five', 'six'],
columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df复制

df.plot.bar()
复制

从上面可以看到,DataFrame会将每一行分成一组,并排显示。
设置stacked=True后可以为DataFrame生成堆积柱状图,这样每一行的值会堆在一起:
df.plot.barh(stacked=True, alpha=0.5)
复制

原书作者准备了一个关于小费的csv数据集,假设想要做一张堆积柱状图来展示每天聚会规模。
tips = pd.read_csv(r'C:\Users\geqiy\Desktop\tips.csv')
tips.head()复制
head()方法可以显示这个DataFrame的前五行:

接下来用pd.crosstab方法创建一个days和size的交叉表。表的index是聚会的日期,columns是聚会的规模,这样就可以知道对应日期的聚会规模了。
party_counts = pd.crosstab(tips['day'], tips['size'])
party_counts复制

seaborn的heatmap可以使得这个交叉表更加直观
sns.heatmap(party_counts)
复制

根据上面heatmap,日期上看周六较多,聚会规模size上2人居多。
接下来normalization一下,将size变成百分比,使得各行的和为1。
party_counts.sum(1)
party_pcts = party_counts.div(party_counts.sum(1), axis=0)
party_pcts复制

party_pcts.plot.bar()
复制

新增一个名为小费比例的列
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
tips.head()复制

plt.figure()
sns.barplot(x='tip_pct', y='day', data=tips, orient='h')复制
seaborn的绘制函数使用了data参数,它可以是DataFrame,比如上面的tips。
不知道你发现sns.barplot()和上面DataFrame.plot.bar()不同的地方没有,刚才DataFrame.plot.bar()把每一列分组并排显示,但是seaborn合计了数据,比如这里即使同一天也有多组数据,但柱状图的值是平均值

plt.figure()
sns.barplot(x='tip_pct', y='day', hue='time', data=tips, orient='h')复制

hue是色值的意思,通过添加hue='time',不同时间点(Dinner和Lunch)用不同颜色区分了开来。
往期回顾

Pandas绘制线型图


Stay hungry, stay foolish