pandas 绘图 (今天总结的有点多)

Pandas绘图

 Pandas数据可视化简介

  • pandas库是Python数据分析的核心库

  • 它不仅可以加载和转换数据,还可以做更多的事情:它还可以可视化

  • pandas绘图API简单易用,是pandas流行的重要原因之一

Pandas 单变量可视化

  • 单变量可视化, 包括条形图、折线图、直方图、饼图等

  • 数据使用葡萄酒评论数据集, 来自葡萄酒爱好者杂志(wineEnthusiast),包含10个字段,150929行,每一行代表一款葡萄酒

    字段名字段描述
    country葡萄酒产地(国家)
    description对酒的评语(气味,味道,外观,感觉等)
    designation用于酿酒的葡萄产自哪个葡萄园
    pointsWineEnthusiast(葡萄酒爱好者杂志)对葡萄酒的评分(1~100)
    price价格
    province葡萄酒产地(省/州)
    region_1葡萄种植区_1
    region_2葡萄种植区_2(有可能为空)
    variety用于酿酒的葡萄种类
    winery酿酒厂名

  • 加载数据

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#加载数据</span>
<span style="color:#770088">import</span> <span style="color:#000000">pandas</span> <span style="color:#770088">as</span> <span style="color:#000000">pd</span>
<span style="color:#000000">reviews</span> = <span style="color:#000000">pd</span>.<span style="color:#000000">read_csv</span>(<span style="color:#aa1111">"data/winemag-data_first150k.csv"</span>, <span style="color:#000000">index_col</span>=<span style="color:#116644">0</span>)
<span style="color:#000000">reviews</span>.<span style="color:#000000">head</span>(<span style="color:#116644">3</span>)</span></span>

显示结果:

countrydescriptiondesignationpointspriceprovinceregion_1region_2varietywinery
0USThis tremendous 100% varietal wine hails from ...Martha's Vineyard96235.0CaliforniaNapa ValleyNapaCabernet SauvignonHeitz
1SpainRipe aromas of fig, blackberry and cassis are ...Carodorum Selección Especial Reserva96110.0Northern SpainToroNaNTinta de ToroBodega Carmen Rodríguez
2USMac Watson honors the memory of a wine once ma...Special Selected Late Harvest9690.0CaliforniaKnights ValleySonomaSauvignon BlancMacauley

 柱状图和分类数据

条形图(柱状图)非常灵活:

  • 高度可以代表任何东西,只要它是数字即可

  • 每个条形可以代表任何东西,只要它是一个类别即可。

  • 条形图是最简单最常用的可视化图表。 在下面的案例中,将所有的葡萄酒品牌按照产区分类,看看哪个产区的葡萄酒品种多:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># figsize 绘图区域大小, fontsize 字体大小 color 颜色</span>
<span style="color:#000000">text_kwargs</span> = <span style="color:#3300aa">dict</span>(
    <span style="color:#000000">figsize</span>=(<span style="color:#116644">16</span>,<span style="color:#116644">8</span>),
    <span style="color:#000000">fontsize</span>=<span style="color:#116644">20</span>,
    <span style="color:#000000">color</span>=[<span style="color:#aa1111">'b'</span>,<span style="color:#aa1111">'orange'</span>,<span style="color:#aa1111">'g'</span>,<span style="color:#aa1111">'r'</span>,<span style="color:#aa1111">'purple'</span>,<span style="color:#aa1111">'brown'</span>,<span style="color:#aa1111">'pink'</span>,<span style="color:#aa1111">'gray'</span>,<span style="color:#aa1111">'cyan'</span>,<span style="color:#aa1111">'y'</span>]
)
​
<span style="color:#aa5500"># 计算省份出现次数,取前10,画图;**text_kwargs表示解包</span>
<span style="color:#000000">reviews</span>[<span style="color:#aa1111">'province'</span>].<span style="color:#000000">value_counts</span>().<span style="color:#000000">head</span>(<span style="color:#116644">10</span>).<span style="color:#000000">plot</span>.<span style="color:#000000">bar</span>(<span style="color:#981a1a">**</span><span style="color:#000000">text_kwargs</span>)</span></span>

显示结果:

  • 上面的图表说明加利福尼亚生产的葡萄酒比其他省都多, 也可以折算成比例, 计算加利福尼亚葡萄酒占总数的百分比

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 计算省份出现次数,取前10,再分别除以数据的总数,就得到省份出产葡萄酒的占比</span>
(<span style="color:#000000">reviews</span>[<span style="color:#aa1111">'province'</span>].<span style="color:#000000">value_counts</span>().<span style="color:#000000">head</span>(<span style="color:#116644">10</span>) <span style="color:#981a1a">/</span> <span style="color:#3300aa">len</span>(<span style="color:#000000">reviews</span>)).<span style="color:#000000">plot</span>.<span style="color:#000000">bar</span>(<span style="color:#981a1a">**</span><span style="color:#000000">text_kwargs</span>)</span></span>

显示结果:在《葡萄酒杂志》(Wine Magazine)评述的葡萄酒中,加利福尼亚生产了近三分之一!

  • 也可以用来展示《葡萄酒杂志》(Wine Magazine)给出的评分数量的分布情况:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 计算所有不同评分的各自数量,再根据评分进行排序,再画图</span>
<span style="color:#000000">reviews</span>[<span style="color:#aa1111">'points'</span>].<span style="color:#000000">value_counts</span>().<span style="color:#000000">sort_index</span>().<span style="color:#000000">plot</span>.<span style="color:#000000">bar</span>(<span style="color:#981a1a">**</span><span style="color:#000000">text_kwargs</span>)</span></span>

显示结果:

 折线图

  • 如果要绘制的数据不是类别值,而是连续值比较适合使用折线图

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">reviews</span>[<span style="color:#aa1111">'points'</span>].<span style="color:#000000">value_counts</span>().<span style="color:#000000">sort_index</span>().<span style="color:#000000">plot</span>.<span style="color:#000000">line</span>()</span></span>

显示结果:

  • 柱状图和折线图区别

    • 柱状图:简单直观,很容易根据柱子的长短看出值的大小,易于比较各组数据之间的差别

    • 折线图:

      • 易于比较各组数据之间的差别

      • 能比较多组数据在同一个维度上的趋势

      • 每张图上不适合展示太多折线

  • 小练习:柱状图或折线图

    • 5种不同口味冰激凌,不同口味冰激凌的销售数量。

    • 国产轿车不同品牌的月销售数量。

    • 学生的考试分数,范围为0-100

 面积图

  • 面积图就是在折线图的基础上,把折线下面的面积填充颜色;当只有一个变量需要制图时,面积图和折线图之间差异不大,在这种情况下,折线图和面积图可以互相替换

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">reviews</span>[<span style="color:#aa1111">'points'</span>].<span style="color:#000000">value_counts</span>().<span style="color:#000000">sort_index</span>().<span style="color:#000000">plot</span>.<span style="color:#000000">area</span>()</span></span>

显示结果:

 直方图

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># price小于200的所有数据df,取price列的值,画图</span>
<span style="color:#000000">reviews</span>[<span style="color:#000000">reviews</span>[<span style="color:#aa1111">'price'</span>] <span style="color:#981a1a"><</span> <span style="color:#116644">200</span>][<span style="color:#aa1111">'price'</span>].<span style="color:#000000">plot</span>.<span style="color:#000000">hist</span>()</span></span>

显示结果:

  • 直方图看起来很像条形图。 直方图是一种特殊的条形图,它可以将数据分成均匀的间隔,并用条形图显示每个间隔中有多少行。 直方图柱子的宽度代表了分组的间距,柱状图柱子宽度没有意义。直方图缺点:将数据分成均匀的间隔区间,所以它们对歪斜的数据的处理不是很好:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">reviews</span>[<span style="color:#aa1111">'price'</span>].<span style="color:#000000">plot</span>.<span style="color:#000000">hist</span>()</span></span>

显示结果:

  • 在第一个直方图中,将价格>200的葡萄酒排除了

  • 在第二个直方图中,没有对价格做任何处理,由于有个别品种的酒价格极高,导致直方图的价格分布发生变化

<span style="background-color:#f8f8f8"><span style="color:#333333">#查看价格较高的葡萄酒情况
reviews[reviews['price'] > 1500]
</span></span>

显示结果:

countrydescriptiondesignationpointspriceprovinceregion_1region_2varietywinery
13318USThe nose on this single-vineyard wine from a s...Roger Rose Vineyard912013.0CaliforniaArroyo SecoCentral CoastChardonnayBlair
34920FranceA big, powerful wine that sums up the richness...NaN992300.0BordeauxPauillacNaNBordeaux-style Red BlendChâteau Latour
34922FranceA massive wine for Margaux, packed with tannin...NaN981900.0BordeauxMargauxNaNBordeaux-style Red BlendChâteau Margaux
  • 数据倾斜:

    • 当数据在某个维度上分布不均匀,称为数据倾斜

    • 一共15万条数据,价格高于1500的只有三条

    • 价格高于500的只有73条数据,说明在价格这个维度上,数据的分布是不均匀的

    • 直方图适合用来展示没有数据倾斜的数据分布情况,不适合展示数据倾斜的数据

<span style="background-color:#f8f8f8"><span style="color:#333333">reviews.shape
</span></span>

显示结果: 共计150930条数据

<span style="background-color:#f8f8f8">(150930, 10)
</span>
<span style="background-color:#f8f8f8"><span style="color:#333333">reviews[reviews['price'] >500].shape
</span></span>

显示结果: 价格大于500的数据只有73条

<span style="background-color:#f8f8f8">(73, 10)
</span>
  • 对葡萄就的评分不存在数据倾斜的情况,评分数据的分布情况比较适合用直方图展示

<span style="background-color:#f8f8f8"><span style="color:#333333">reviews['points'].plot.hist()
</span></span>

显示结果:

 饼图

  • 饼图也是一种常见的可视化形式

<span style="background-color:#f8f8f8"><span style="color:#333333">reviews['province'].value_counts().head(10).plot.pie()
</span></span>

显示结果:

  • 饼图的缺陷:饼图只适合展示少量分类在整体的占比

    • 如果分类比较多,必然每个分类的面积会比较小,这个时候很难比较两个类别

    • 如果两个类别在饼图中彼此不相邻,很难进行比较

    • 可以使用柱状图图来替换饼图

 Pandas 双变量可视化

  • 在上一小结中,介绍了使用Pandas绘图,理解单个变量在数据中的互相关系,本小节会考察两个变量如何进行可视化

  • 数据分析时,我们需要找到变量之间的相互关系,比如一个变量的增加是否与另一个变量有关,数据可视化是找到两个变量的关系的最佳方法

散点图

  • 最简单的两个变量可视化图形是散点图,散点图中的一个点,可以表示两个变量

    <span style="background-color:#f8f8f8"># 价格小于100的葡萄酒,随机取样100个数据,评分分布
    reviews[reviews['price'] < 100].sample(100).plot.scatter(x='price', y='points')
    </span>

    显示结果:

    • 调整图形大小,字体大小,由于pandas的绘图功能是对Matplotlib绘图功能的封装,所以很多参数pandas 和 matplotlib都一样

    <span style="background-color:#f8f8f8">reviews[reviews['price'] < 100].sample(100).plot.scatter(x='price', y='points', figsize=(14,8), fontsize = 16)
    </span>
    • 修改x轴 y轴标签字体

    <span style="background-color:#f8f8f8">from matplotlib import pyplot as plt
    # 创建绘图区域和坐标轴
    fig, axes = plt.subplots(ncols=1, figsize=(20,10))
    # 使用pandas 在指定坐标轴内绘图
    reviews[reviews['price'] < 100].sample(100).plot.scatter(x='price', y='points', figsize=(14,8), fontsize=16, ax=axes)
    # 通过坐标轴修改标签内容和字体大小
    axes.set_xlabel('price', fontdict={'fontsize':16})
    </span>

    显示结果:价格和评分之间有一定的相关性:也就是说,价格较高的葡萄酒通常得分更高

  • 请注意,我们必须对数据进行采样,从所有数据中抽取100条数据,如果将全部数据(15万条)都绘制到散点图上,会有很多点重叠在一起,不方便观察

    <span style="background-color:#f8f8f8">reviews[reviews['price'] < 100].plot.scatter(x='price', y='points',figsize=(12,8))
    </span>

    显示结果:

  • 由于散点图的缺点,因此散点图最适合使用相对较小的数据集以及具有大量唯一值的变量。

  • 有几种方法可以处理过度绘图。 一:对数据进行采样 二:hexplot(蜂巢图)

hexplot蜂巢图

  • hexplot将数据点聚合为六边形,然后根据其内的值为这些六边形上色:

<span style="background-color:#f8f8f8"><span style="color:#333333">reviews[reviews['price'] < 100].plot.hexbin(x='price', y='points', gridsize=15, figsize=(14,8))
</span></span>

显示结果:

  • 上图x轴坐标缺失,属于bug,可以通过调用matplotlib的api添加x坐标

<span style="background-color:#f8f8f8"><span style="color:#333333">fig, axes = plt.subplots(ncols=1, figsize = (12,8))
reviews[reviews['price'] < 100].plot.hexbin(x='price', y='points', gridsize=15,ax = axes)
axes.set_xticks([0,20,40,60,80,100])
</span></span>

显示结果:

  • 该图中的数据可以和散点图中的数据进行比较,但是hexplot能展示的信息更多

  • 从hexplot中,可以看到《葡萄酒杂志》(Wine Magazine)评论的葡萄酒瓶大多数是87.5分,价格20美元

  • Hexplot和散点图可以应用于区间变量和有序分类变量的组合。

堆叠图(Stacked plots)

  • 展示两个变量,除了使用散点图,也可以使用堆叠图

  • 堆叠图是将一个变量绘制在另一个变量顶部的图表

  • 接下来通过堆叠图来展示最常见的五种葡萄酒

<span style="background-color:#f8f8f8"><span style="color:#333333"># 将葡萄酒种类分组,找到最常见的五种葡萄酒
reviews.groupby(['variety'])['country'].count().sort_values(ascending = False)
</span></span>

显示结果:

<span style="background-color:#f8f8f8">variety
Chardonnay                  14482
Pinot Noir                  14288
Cabernet Sauvignon          12800
Red Blend                   10061
Bordeaux-style Red Blend     7347
                       ...  
Chinuri                         1
Petit Meslier                   1
Espadeiro                       1
Parraleta                       1
Erbaluce                        1
Name: country, Length: 632, dtype: int64
</span>
  • 从结果中看出,最受欢迎的葡萄酒是,Chardonnay(霞多丽白葡萄酒),Pinot Noir(黑皮诺),Cabernet Sauvignon(赤霞珠),Red Blend(混酿红葡萄酒) ,Bordeaux-style Red Blend (波尔多风格混合红酒)

  • 从数据中取出最受欢迎的五种葡萄酒

<span style="background-color:#f8f8f8"><span style="color:#333333">top_5_wine = reviews[reviews.variety.isin(['Chardonnay','Pinot Noir','Cabernet Sauvignon','Red Blend','Bordeaux-style Red Blend'])]
</span></span>
  • 通过透视表找到每种葡萄酒中,不同评分的数量

<span style="background-color:#f8f8f8"><span style="color:#333333"># 透视表计数
wine_counts = top_5_wine.pivot_table(index=['points'], columns ==['variety'], values='country', aggfunc='count')
# 修改列名
wine_counts.columns = ['Bordeaux-style Red Blend','Cabernet Sauvignon','Chardonnay','Pinot Noir','Red Blend']
wine_counts
</span></span>

显示结果:

pointsBordeaux-style Red BlendCabernet SauvignonChardonnayPinot NoirRed Blend
805.089.070.036.075.0
8123.0160.0154.083.0108.0
8283.0436.0523.0296.0233.0
83122.0571.0686.0350.0366.0
84334.0925.01170.0757.0623.0
85379.01058.01299.0903.0608.0
86467.01205.01525.01260.0919.0
87679.01589.01887.01784.01375.0
88741.01160.01513.01586.01366.0
89724.0920.01039.01223.01013.0
90901.01341.01435.01646.01131.0
91821.0825.0938.01124.0881.0
92733.01018.0953.01173.0620.0
93556.0653.0671.0992.0395.0
94338.0440.0325.0621.0190.0
95220.0233.0188.0269.088.0
96124.0102.073.0105.030.0
9767.056.023.056.027.0
9822.012.07.020.06.0
998.04.0NaN2.05.0
100NaN3.03.02.02.0
  • 从上面的数据中看出,行列分别表示一个类别变量(评分,葡萄酒类别),行列交叉点表示计数,这类数据很适合用堆叠图展示

<span style="background-color:#f8f8f8"><span style="color:#333333">wine_counts.plot.bar(stacked=True)
</span></span>

显示结果:

  • 上图为堆积柱状图,适合展示少量类别的分类数据;也可以使用面积堆积图:

<span style="background-color:#f8f8f8"><span style="color:#333333">wine_counts.plot.area()
</span></span>

显示结果:

  • 面积堆积图的使用限制:

    • ① 种类较多的数据不适合用堆积图,图中显示的数据有五个种类,比较合适,一般不要超过8个种类

    • ② 堆积图的可解释性(读图)较差

  • 折线图

    • 折线图在双变量可视化时,仍然非常有效

<span style="background-color:#f8f8f8"><span style="color:#333333">wine_counts.plot.line()
</span></span>

显示结果:

  • 从上图看出,折线图的读图更容易,更容易对不同类别做对比

    例如,在87分的酒中,哪个类别更多?从图中很容易看出,绿色的霞多丽比红色的黑比诺略多

总结

  • Pandas绘图是对Matplotlib的封装

  • Series和DataFrame 都有plot属性,根据不同的图形类型,调用对应的函数

  • 可以通过Matplotlib控制图片的方法来控制Pandas绘图的效果

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值