Matplotlib可视化
![](https://img.haomeiwen.com/i1026876/19722633cf91bdf8.jpg)
创建图与图表是很多分析项目中的一个重要步骤,它通常是项目开始时探索性数据分析(EDA)的一部分,或者在项目报告阶段向其他人介绍你的数据分析结果时使用。
matplotlib是一个绘图库,创建的图形可达到出版的质量要求。它可以创建常用的统计图,包括条形图、箱线图、折线图、散点图和直方图等等图形。
matplotlib提供了对图形各个部分进行定制的功能。例如,它可以设置图形的形状和大小、x轴与y轴的范围和标度、x轴和y轴的刻度线和标签、图例以及图形的标题。更多关于定制图形的信息请查看:https://matplotlib.org/users/beginner.html 。
下面,我们就开始学习一些常见图形的绘制,使用的数据来自The Complete Pokemon Dataset。
先将数据导入,
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
data = pd.read_csv('../../Datasets/pokemon.csv')
data.head()
![](https://img.haomeiwen.com/i1026876/c608009f26308daa.png)
数据每一列的含义如下,
![](https://img.haomeiwen.com/i1026876/e77f668ed4e1b3f4.png)
条形图
假如我们想查看一下每一代Pokemon的数量,并用条形图显示出来,该怎么办呢?
generation = data['generation'].value_counts()
plt.bar(generation.index, generation.values)
可以看到如下结果:
![](https://img.haomeiwen.com/i1026876/13ca53407e837612.png)
如果我们想添加轴标签和标题的话,加上如下内容即可:
plt.xlabel('generation')
plt.ylabel('count')
plt.title('Generation and Count')
![](https://img.haomeiwen.com/i1026876/b9f052794e7aed21.png)
为了方便起见,我们也可以为每个条加上数值标签,
for x,y in enumerate(generation.values):
plt.text(x+1,y,'%s' % y,ha='center')
![](https://img.haomeiwen.com/i1026876/e3411d640e20e7a7.png)
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
- x: 指定图形横轴坐标
- height: 指定条形图的高度
- width: 指定条形图的宽度
- color: 指定条形图前景色
- edgecolor: 设置条形图边界颜色
- linewidth: 设置条形图边界宽度
更多内容请查看:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html
知道了上述参数的含义之后,我们就可以对之前的图形进行小小的改动啦!
generation = data['generation'].value_counts()
plt.bar(generation.index, generation.values, facecolor='orange',edgecolor='green', linewidth=2)
plt.xlabel('generation')
plt.ylabel('count')
plt.title('Generation and Count')
for x,y in enumerate(generation.values):
plt.text(x+1,y,'%s' % y,ha='center')
![](https://img.haomeiwen.com/i1026876/330723d46abd881f.png)
箱线图
箱线图一般用来展示数据的分布(如上下四分位数、中位数等),同时,也可以用来反映数据的异常情况。
box = data[['defense','attack','hp']]
plt.boxplot(box.values)
plt.setp(plt.gca(),xticklabels=['defense','attack','hp'])
![](https://img.haomeiwen.com/i1026876/6889e265bb2f2b02.png)
matplotlib.pyplot.boxplot函数详情:
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False, zorder=None)
- x: 指定绘图的数据
- notch: 是否是凹口的形式展示箱线图,默认为非凹口
- sym: 指定异常点的形状
- vert: 是否需要将图形垂直摆放,默认为垂直摆放
- whis: 指定上下须与上下四分位数的距离,默认为1.5倍的四分位差
- positions: 指定图形的位置,默认为[0,1,2……]
- widths: 指定图形的宽度,默认为0.5
- patch_artist: 是否填充箱体的颜色
- meanline: 是否用线表示均值,默认用点表示
- showmeans: 是否显示均值,默认不显示
- showcaps: 是否显示图形顶端和末端的两条线,默认显示
- showbox: 是否显示图形的箱体,默认显示
- showfliers: 是否显示异常值,默认显示
- boxprops: 设置箱体的属性,如边框色、填充色等
- labels: 指定箱线图的标签
- filerprops: 设置异常值的属性,如异常点的形状、大小等
- medianprops: 设置中位数的属性,如线的类型、粗细等
- meanprops: 设置均值的属性,如点的大小、颜色等
- capprops: 设置图形顶端和末端线条的属性,如颜色、粗细等
- whiskerprops: 设置须得属性,如颜色、粗细等
更多内容请查看:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.boxplot.html
折线图
我们不妨查看一下每一代Pokemon攻击力的走势,
generation_attack = data.pivot('name', 'generation', 'attack').fillna(0)
for col in generation_attack.columns:
gene = generation_attack[generation_attack[col] > 0][col].sort_values()
plt.plot(range(gene.shape[0]),gene.values,label=col)
plt.legend()
plt.ylabel('Attack')
![](https://img.haomeiwen.com/i1026876/b09537c5ddf8235e.png)
matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
- x: x轴数据
- y: y轴数据
- fmt: 格式化字符串
更多内容请查看:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html
散点图
将防御力和攻击力用散点图绘制出来,
plt.scatter(data['attack'], data['defense'])
plt.xlabel('attck')
plt.ylabel('defense')
![](https://img.haomeiwen.com/i1026876/d004ddea29f00c59.png)
matplotlib.pyplot.scatter函数详情:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None)
- x: 指定数据横坐标
- y: 指定数据纵坐标
- s: 指定标记大小
- c: 指定标记颜色
- marker: 设置标记样式
- alpha: 设置透明度
- linewidths: 设置标记边缘的线宽
- edgecolors: 设置标记边缘的颜色
更多内容请查看:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html
直方图
将防御力的分布用直方图绘制,
plt.hist(data['defense'],bins=25)
plt.xlabel('Defense')
plt.ylabel('Frequency')
![](https://img.haomeiwen.com/i1026876/4a3a3b52151410d0.png)
matplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None)
- x: 指定每个bin分布的数据,对应x轴
- bins: 指定bin的个数
- range: 指定bin的分布范围
- density: 是否将得到的直方图归一化
- cumulative: 是否绘制累积频数图
- bottom: 指定每个bin底部的基线位置
- histtype: 指定直方图类型
- align: 设置直方图的绘制方式,默认为mid
- orientation: 指定方向,水平或垂直
- log: 是否使用对数刻度
- label: 设置图形的标签说明
- stacked: 是否将图形堆叠
更多内容请查看:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html
饼图
接下来,我们可以看一下幻之宝可梦所占的比例,
color = ["aqua", "orange"]
leg = [data[data['is_legendary'] == 0].shape[0],data[data['is_legendary'] == 1].shape[0]]
legPie = plt.pie(leg,labels=['Non Legendary', 'Legendary'],colors=color,shadow=True,
autopct='%1.1f%%',startangle=45,explode=(0,0.1))
![](https://img.haomeiwen.com/i1026876/4cc6c7af6182f329.png)
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False)
- x: 指定绘图的数据
- explode: 指定饼图某些部分突出显示
- labels: 指定饼图的标签说明
- colors: 指定饼图的填充色
- autopct: 设置百分比格式
- pctdistance: 设置百分比标签与圆心的距离
- shadow: 是否添加阴影效果
- labeldistance: 设置各扇形标签与圆心的距离
- startangle: 设置饼图的初始摆放角度
- radius: 设置饼图的半径大小
- counterclock: 是否让饼图按逆时针显示
- wedgeprops: 设置饼图内外边界属性,如边界线的粗细、颜色等
- textprops: 设置饼图中文本的属性,如字体大小、颜色等
- center: 指定饼图的中心位置
- frame: 是否要显示饼图背后的图框
- rotatelabels: 是否要让扇形标签跟着扇形角度旋转
更多内容请查看:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.pie.html
如果感觉意犹未尽的话,可以到:https://matplotlib.org/gallery/index.html
![](https://img.haomeiwen.com/i1026876/a124966c63b5d008.png)
学习各种图的绘制。
万一这都满足不了你对可视化的追求的话,可以参考10 Useful Python Data Visualization Libraries for Any Discipline学习。
参考:
[1] https://liam.page/2014/09/11/matplotlib-tutorial-zh-cn/
[2] https://blog.csdn.net/ScarlettYellow/article/details/80458797
[3] https://wizardforcel.gitbooks.io/matplotlib-user-guide/content/
[4] https://blog.csdn.net/qq_34337272/article/details/79555544