pandas可以做的不仅仅是加载和转换数据,它还可以可视化数据。比起一大堆的matplotlib代码,使用pandas内置的plot 函数绘图更简洁。
下面通过简单的例子掌握pandas基本的绘图方法。
了解数据
数据源来自kaggle-葡萄酒杂志评论。
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
# 葡萄酒杂志评论数据
reviews = pd.read_csv("kaggle/winemag-data_first150k.csv", index_col=0)
head = reviews.head(3)
柱形图
柱形图可以说是最简单的数据可视化。通过柱子来表现数据的高度,进而比较不同数据之间的差异,一眼可以看到数据量的大小对比。在本例子中展现top10葡萄酒产量的省份对比
reviews['province'].value_counts().head(10).plot.bar()
从上图中可以看出California的产量远远高于世界其他省份的产量,我们可能会问,California葡萄酒占总葡萄酒的百分比是多少?这个柱形图告诉我们绝对值,但知道相对比例更有用。
(reviews['province'].value_counts().head(10)/len(reviews)).plot.bar()
从上图可以得知California出产的葡萄酒几乎占葡萄酒杂志评论的三分之一。
柱形图非常灵活:高度可以表示任何东西,只要它是一个数字。每个栏可以代表任何东西,只要它是一个分类。
上例的中省份分类是一个定类数据(没有内在固有大小或高低顺序),还有一种分类数据是定序数据,它相对于定类数据类型来说存在一种程度有序现象,例如下例中葡萄酒不同评分的评论数量。
reviews['points'].value_counts().sort_index().plot.bar()
从上图可看到,每个葡萄酒的总分都在80到100分之间。有20个分数值类别,柱状图刚好可以完全展示这些值。如果评分是0-100呢?恐怕无法完全展示每个类别的情况,这时,我们需要使用折线图。
折线图
reviews['points'].value_counts().sort_index().plot.line()
面积图
当只绘制一个变量时,面积图和折线图之间的区别主要是可视化的。在这种情况下,它们可以互换使用。
reviews['points'].value_counts().sort_index().plot.area()
直方图
直方图是用一系列等宽不等高的长方形来绘制,宽度表示数据的范围间隔,高度表示频数或者频率。
查看葡萄酒价格分布
reviews['price'].plot.hist()
从上图看价格主要分布在0~200,由于高位价格偏差,导致价格区间过大,看不出问题。
len(reviews[reviews['price'] > 200])/len(reviews)
通过计算,发现价格在200以上的占比只有 0.005,可以忽略,处理一下数据偏差,重新查看price<200时的价格数量分布
reviews[reviews['price'] < 200]['price'].plot.hist()
总结
柱形图 | 折线图 | 面积图 | 直方图 |
---|---|---|---|
df.plot.bar() | df.plot.line() | df.plot.area() | df.plot.hist() |
适合展示少量的定类数据。 | 适用于有序数据和区间数据 | 同折线图 | 适合展示区间数据 |
相关资料
https://www.kaggle.com/residentmario/univariate-plotting-with-pandas