绘图和可视化(Python)
文章目录
- 9.1 matplotlib API 入门
- 图形和子图
- 调整子图周围的间距
- 颜色,标记和线性
- 刻度、标签和图例
- 设置标题、轴标签、刻度以及刻度标签
- 添加图例
- 注解
- 将图表保存到文件
- 9.2 使用 pandas 和 seaborn 绘图
- 线形图
- 柱状图
- 直方图和密度图
- 散点图
- 简单的散点图
- 散点图分组
- 散点图点形状
信息可视化(也叫绘图)是数据分析中最重要的工作之一。它可能是探索过程的一部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的想法等。另外,做一个可交互的数据可视化也许是工作的最终目标。Python 有许多库进行静态或动态的数据可视化,但我这里重要关注于 matplotlib 和基于它的库。
matplotlib 是一个用于创建出版质量图表的桌面绘图包(主要是 2D 方面)。该项目是由 John Hunter 于 2002 年启动的,其目的是为 Python 构建一个 MATLAB 式的绘图接口。matplotlib 和 IPython 社区进行合作,简化了从 IPython shell(包括现在的 Jupyter 笔记本)进行交互式绘图。matplotlib 支持各种操作系统上许多不同的 GUI 后端,而且还能将图片导出为各种常见的向量(vector)和光栅(raster)图:PDF、SVG、JPG、PNG、BMP、GIF 等。除了几张,本书中的大部分图都是用它生成的。
随着时间的发展,matplotlib 衍生出了多个数据可视化的工具集,它们使用 matplotlib 作为底层。其中之一是 seaborn,本章后面会学习它。
学习本章代码案例的最简单方法是在 Jupyter 笔记本进行交互式绘图。在 Jupyter 笔记本中执行下面的语句:
%matplotlib notebook
9.1 matplotlib API 入门
matplotlib通常的引入方式如下
In [11]: import matplotlib.pyplot as plt
创建一个简单的图形
In [12]: import numpy as npIn [13]: data = np.arange(10)In [14]: data
Out[14]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [15]: plt.plot(data)
图形和子图
matplotlib图像都位于图形中,可以使用plt.figure创建一个新的图形
In [16]: fig = plt.figure()
plt.figure有一些选项,特别是figsize,它用于确保当图片保存到磁盘时具有一定的大小和纵横比。figsizie用来指定图形的长和宽,传入的是一个二元数组
plt.figure(figsize=(2,4))
使用add_subplot 可以在图形中创建多个子图
In [17]: ax1 = fig.add_subplot(2, 2, 1)
这条代码的意思是图像是2*2的分布的,且当前选中的是4张图的第一个。。如果再把后面两个子图也创建出来,最终得到的图像如图 9-2 所示:
In [18]: ax2 = fig.add_subplot(2, 2, 2)In [19]: ax3 = fig.add_subplot(2, 2, 3)
如果这时执行一条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib 就会在最后一个用过的子图(如果没有则创建一个)上进行绘制,隐藏创建图形和子图的过程。因此,如果我们执行下列命令,你就会得到如图 9-3 所示的结果:
In [20]: plt.plot(np.random.randn(50).cumsum(), 'k--')
k–是线性选项,告诉matplotlib绘制的是黑色线性虚线图。
上面那些有fig.add_subplot所返回的对象是AxesSubplot对象,直接调用他们的实例方法就可以在其所代表的空格中画图了
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
plt.plot(np.random.randn(40).cumsum(),'k--')
ax1.hist(np.random.randn(100),bins=20,color='k',alpha = 0.3)
ax2.scatter(np.arange(30),np.arange(30)+3+np.random.randn(30))
创建包含子图网格的图形是一个常见的任务,matplotlib有一个更便捷的方法plt.subplots,它可以创建一个新的图形,并返回一个已含有子图对象的numpy数组
plt.subplots生产两个对象一个是图形对象,一个是子图对象的数组
In [24]: fig, axes = plt.subplots(2, 3)In [25]: axes
Out[25]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7fb626374048>,<matplotlib.axes._subplots.AxesSubplot object at 0x7fb62625db00>,<matplotlib.axes._subplots.AxesSubplot object at 0x7fb6262f6c88>],[<matplotlib.axes._subplots.AxesSubplot object at 0x7fb6261a36a0>,<matplotlib.axes._subplots.AxesSubplot object at 0x7fb626181860>,<matplotlib.axes._subplots.AxesSubplot object at 0x7fb6260fd4e0>]], dtype
=object)
这是非常实用的,因为可以轻松地对axes数组进行索引,就好像是一个二维数组一样,例如axes[0,1]。你还可以通过sharex和sharey指定子图应该具有相同的 X 轴或 Y 轴。在比较相同范围的数据时,这也是非常实用的,否则,matplotlib 会自动缩放各图表的界限。有关该方法的更多信息,请参见表 9-1。
调整子图周围的间距
默认情况下,matplotlib会在子图周围留下一定的间距,间距和图像的高度与宽度有关,因此你调整了图像的大小,间距的大小也会改变,利用图形的subplots_adjust方法可以调增子图的间距,同时它也是一个顶级函数
subplots_adjust(left=None, bottom=None, right=None, top=None,wspace=None, hspace=None)
wspace和hspace是用来控制高度和宽度的间距的百分比(这个百分比是相对于图像的百分比,1就是一个图像的间距),
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):for j in range(2):axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)
颜色,标记和线性
matplotlib中的plot函数接受一组X和Y坐标,还可以接受表示颜色和线性的字符串缩写。例如要画出一个绿色,虚线的图形,可以这样话
ax.plot(x, y, 'g--')
这种在一个字符串中指定颜色和线型的方式非常方便。在实际中,如果你是用代码绘图,你可能不想通过处理字符串来获得想要的格式。通过下面这种更为明确的方式也能得到同样的效果:
常见的表示颜色的快捷字符串都是常见颜色的首字母(比如蓝色是b)
常见的表示线性的快捷字符串有"-“,”–“,”- “,”:"
ax.plot(x, y, linestyle='--', color='g')
常用的颜色可以用颜色名缩写,也可以指定颜色码(例如,‘#CECECE’),可以查看plot文档字符串查看所有线性的合集(在 IPython 和 Jupyter 中使用plot?)。
对折线图上的点设置形状以便区分,使用关键字marker可以进行设置,一些常用的形状也可以使用字符串快捷标记(常用的快捷标记有".“,“o”,”^“,”>“,”<","v"等
In [30]: from numpy.random import randnIn [31]: plt.plot(randn(30).cumsum(), 'ko--')
还可以将其写成更为明确的形式:
plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')
关键字linestyle可以用ls代替
在线形图中,点与点的连接方式是线型,但是可以通过关键字drawstyle来进行设置
注意drawstyle是指定点与点的连接方式,连接方式有:drawstyle or ds: {‘default’, ‘steps’, ‘steps-pre’, ‘steps-mid’, ‘steps-post’}, default: ‘default’
plt.legend(loc=‘best’)用来展现图例,参数loc='best’是用来设置图例的位置的
In [33]: data = np.random.randn(30).cumsum()In [34]: plt.plot(data, 'k--', label='Default')
Out[34]: [<matplotlib.lines.Line2D at 0x7fb624d86160>]In [35]: plt.plot(data, 'k-', drawstyle='steps-post', label='steps-post')
Out[35]: [<matplotlib.lines.Line2D at 0x7fb624d869e8>]In [36]: plt.legend(loc='best')
刻度、标签和图例
对于大多数的图表装饰项,其主要实现方式有二:使用过程型的pyplot接口(例如,matplotlib.pyplot)以及更为面向对象的原生 matplotlib API。
pyplot接口的设计目的就是交互式使用,含有诸如xlim、xticks和xticklabels之类的方法。它们分别控制图表的范围、刻度位置、刻度标签等。其使用方式有以下两种:
调用时不带参数,则返回当前的参数值(例如,plt.xlim()返回当前的 X 轴绘图范围)。
调用时带参数,则设置参数值(例如,plt.xlim([0,10])会将 X 轴的范围设置为 0 到 10)。
所有这些方法都是对当前或最近创建的AxesSubplot起作用的。它们各自对应子图对象上的两个方法,以xlim为例,就是ax.get_xlim和ax.set_xlim。我更喜欢使用子图的实例方法(因为我喜欢明确的事情,而且在处理多个子图时这样也更清楚一些)。当然你完全可以选择自己觉得方便的那个。
设置标题、轴标签、刻度以及刻度标签
由于画图中出现中文的话,只能显示成方框,所以可以添加以下代码解决问题
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体(解决中文无法显示的问题)
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号“-”显示方块的问题
然后画图
具体设置方法见下面的代码解释
fig = plt.figure()
#画一个随机漫步的折线图,设置图例
plt.plot(np.random.randn(100).cumsum(),'g--',label = '折线')
#使用xticks设置x轴刻度,第一个关键字是设置轴刻度
#labels为设置轴刻度标签,与轴刻度要等对应上
#rotation设置刻度标签的旋转角度,rotation = 90为轴标签旋转90度也就是变成了竖直方向
#fonsize 设置轴标签的字体大小
plt.xticks([0,25,50,75,100],labels=['one','two','three','four','five'],rotation = 90,fontsize = 10)
#title设置标题
plt.title('随机漫步折线图')
#xlabel设置x轴标题
plt.xlabel('X轴')
#设置y轴标题
plt.ylabel('y轴')
#显示图例
plt.legend(loc = 'best')
参考资料matplotlib画图之修改坐标轴刻度
添加图例
图例(legend)是一种用于标识图表的重要工具,添加图例的方式有很多种,但是最简单的莫过于在添加子图的时候传入label参数
plt.legend是用来显示图例的,loc = 'best’表示把图例放在最合适的位置
fig = plt.figure(figsize=(8,3))
plt.plot(np.random.randn(100).cumsum(),'g',label = 'one')
plt.plot(np.random.randn(100).cumsum(),'g--',label = 'two')
plt.plot(np.random.randn(100).cumsum(),'g.',label = 'three')
plt.legend(loc = 'best')
注解
注解主要使用text函数,前两个参数用来定位注解的位置,第三个参数用来指定注解。还有些可选的参数主要用来设置注解字体,位置,大小等
例子
fig = plt.figure(figsize=(8,3))
plt.plot(np.random.randn(100).cumsum(),'g--',label = '折线')
plt.xticks([0,25,50,75,100],labels=['one','two','three','four','five'],rotation = 90,fontsize = 10)
plt.title('随机漫步折线图')
plt.xlabel('X轴')
plt.ylabel('y轴')
plt.legend(loc = 'best')
#使用text设置注解,fontsize表示注解的字体大小
plt.text(20,7,'你好',fontsize = 20)
将图表保存到文件
利用plt.savefig可以将当前图表保存到文件中,该方法相当于图形对象的实例方法savefig。例如要讲图表保存为svg格式,你只需要输入
plt.savefig('figpath.svg')
文件类型可以通过扩展名进行指定,当前支持的扩展名有eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff等。
参数dpi可以设置文件分辨率
参数bbox_inches可以剪去图片中空白的部分
plt.savefig('figpath.png', dpi=400, bbox_inches='tight')
表 9-2 列出了savefig的其它选项。
9.2 使用 pandas 和 seaborn 绘图
matplotlib 实际上是一种比较低级的工具。要绘制一张图表,你组装一些基本组件就行:数据展示(即图表类型:线型图、柱状图、盒形图、散点图、等值线图等)、图例、标题、刻度标签以及其他注解型信息。
在 pandas 中,我们有多列数据,还有行和列标签。pandas 自身就有内置的方法,用于简化从DataFrame和Series绘制图形。另一个库 seaborn,由 Michael Waskom 创建的静态图形库。Seaborn 简化了许多常见可视类型的创建。
提示:引入 seaborn 会修改 matplotlib 默认的颜色方案和绘图类型,以提高可读性和美观度。即使你不使用 seaborn API,你可能也会引入 seaborn,作为提高美观度和绘制常见 matplotlib 图形的简化方法。
线形图
Series和DataFrame,都有一个用于生成各类图表的plot方法(相当于pandas里面内置了matplotlib),默认情况下他们生成的是线形图
In [60]: s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))In [61]: s.plot()
该Series的索引会被传给matplotlib并用于绘制X轴,可以使用参数use_index = False禁用该功能。X 轴的刻度和界限可以通过xticks和xlim选项进行调节,Y 轴就用yticks和ylim。plot参数的完整列表请参见表 9-3。我只会讲解其中几个,剩下的就留给读者自己去研究了。
pandas大部分绘图的方法都有一个ax参数,此参数是用来指定该图形要画在哪个子图对象上,如果不进行指定则画在最近一个使用的图像上
In [62]: df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),....: columns=['A', 'B', 'C', 'D'],....: index=np.arange(0, 100, 10))In [63]: df.plot()
针对DataFrame格式的对象进行画图,其每列都会生成一个折线,列名会变成图例,行标签会变成X轴标签
DataFrame还有一些对列进行灵活处理的选项,例如是把所有的列绘制在一个子图中还是创建各自的子图。详细信息请参照列表
柱状图
plot.bar()和plot.barh()分别用来绘制水平和垂直的柱状图,Series和DataFrame的行标签为X轴(bar)或Y轴(barh)的刻度
In [64]: fig, axes = plt.subplots(2, 1)In [65]: data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))In [66]: data.plot.bar(ax=axes[0], color='k', alpha=0.7)
Out[66]: <matplotlib.axes._subplots.AxesSubplot at 0x7fb62493d470>In [67]: data.plot.barh(ax=axes[1], color='k', alpha=0.7)
color和alpha是用来设置颜色以及透明度的
对于DataFrame,其每行的值为一组,并排显示
In [69]: df = pd.DataFrame(np.random.rand(6, 4),....: index=['one', 'two', 'three', 'four', 'five', 'six'],....: columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))In [70]: df
Out[70]:
Genus A B C D
one 0.370670 0.602792 0.229159 0.486744
two 0.420082 0.571653 0.049024 0.880592
three 0.814568 0.277160 0.880316 0.431326
four 0.374020 0.899420 0.460304 0.100843
five 0.433270 0.125107 0.494675 0.961825
six 0.601648 0.478576 0.205690 0.560547In [71]: df.plot.bar()
注意DataFrame的列名称被用作的图例的名称
设置stacked = True即可为DataFrame生成堆积图,这样每行的值就会堆积在一起
In [73]: df.plot.barh(stacked=True, alpha=0.5)
注意:柱状图有一个不错的功能,可以画出Series对象值出现的频率。s.count_value.plot.bar()
直方图和密度图
直方图(histogram)是一种可以对值频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。再以前面那个小费数据为例,通过在Series使用plot.hist方法,我们可以生成一张“小费占消费总额百分比”的直方图(如图 9-21 所示):
df3.plot.hist(bins = 50)
与此相关的一种图表类型是密度图,它是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正态分布之类的较为简单的分布)。因此,密度图也被称作 KDE(Kernel Density Estimate,核密度估计)图。使用plot.kde和标准混合正态分布估计即可生成一张密度图(见图 9-22):
df3.plot.density()
散点图
点图或散点图是观察两个一维数据之间关系的有效手段,。
简单的散点图
#绘制简单的散点图
df = pd.DataFrame(np.random.rand(50,4),columns=['A','B','C','D'])
#使用df的A列和B列作为散点图数据
df.plot.scatter(x='A',y='B')
散点图分组
#散点图分组
#label为图例
ax = df.plot.scatter(x='A',y='B',color = 'b',label='A')
ax指定把图画到哪个图形中,ax = ax是为了把两个图都放在ax的图形中
df.plot.scatter(x='C',y='D',color = 'g',label='B',ax = ax)
散点图点形状
使用关键字marker可以设置散点图的点形状,如下所示
#marker = '^'设置点形状为三角形
df.plot.scatter(x='A',y='B',color = 'b',marker = '^')
常用的Marker有:
Marker类型 散点形状
“.”(点) 点
“,”(逗号)、“s” 像素(小正方形)
“o” 圈
“V” 倒三角
“^” 正三角
“<” 左三角
“>” 右三角
“*” 星星
“x” 叉号
“+” 加号
绘图和可视化(Python)相关推荐
- python绘图和可视化_Python 绘图和可视化详细介绍
Python之绘图和可视化 1. 启用matplotlib 最常用的Pylab模式的IPython(IPython --pylab) 2. matplotlib的图像都位于Figure对象中. 可以使 ...
- Python数据分析学习系列 九 绘图和可视化
Python数据分析学习系列 九 绘图和可视化 资料转自(GitHub地址):https://github.com/wesm/pydata-book 有需要的朋友可以自行去github下载 信息可视化 ...
- 《利用Python 进行数据分析》第八章:绘图和可视化
对<利用Python 进行数据分析>(Wes Mckinney著)一书中的第八章中绘图和可视化进行代码实验.原书中采用的是Python2.7,而我采用的Python3.7在Pycharm调 ...
- python交互式绘图库_一个交互式可视化Python库——Bokeh
本篇为<Python数据可视化实战>第十篇文章,我们一起学习一个交互式可视化Python库--Bokeh. Bokeh基础 Bokeh是一个专门针对Web浏览器的呈现功能的交互式可视化Py ...
- Excel 数据的统计分析及绘图自动处理的python示例(精益办公实战2)
Excel 数据统计分析及绘图的自动处理python示例(精益办公实战2) 1.背景描述: "看数不如看表,看表不如看图" 2.数据准备和任务要求: 数据准备 一份已经经过数据清洗 ...
- [数据分析与可视化] Python绘制数据地图2-GeoPandas地图可视化
本文主要介绍GeoPandas结合matplotlib实现地图的基础可视化.GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口.GeoPandas扩展了Pandas ...
- Python数据可视化 | Python实现Matplotlib系列colorbar的设置
Python数据可视化 | Python实现Matplotlib系列colorbar的设置 目录 Python数据可视化 | Python实现Matplotlib系列colorbar的设置 color ...
- python编程语言排行曲线绘制_最新编程语言排名(TIOBE)-数据抓取及绘图(使用Python)...
本章数据分析的主要步骤: 1.从网上获取公开数据:html 网页 2.读取html中表格数据 3.数据清洗和整理 4.数据绘图与可视化 5.保存绘图 接下来进行详细的说明 1.从网上获取公开数据:ht ...
- 绘图与可视化(数据分析)
目录 第9章 绘图与可视化 9.1 简明matplotlib API入门 9.1.1 图片与子图 9.1.2 颜色color.标记marker和线类型linestyle 9.1.3 刻度.标签和图例 ...
- caffe预测、特征可视化python接口调用
转载自: 深度学习(九)caffe预测.特征可视化python接口调用 - hjimce的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/hjimce/articl ...
最新文章
- Go 学习笔记(58)— Go 第三方库之 etcd/clientv3(连接客户端、PUT、GET、Lease、Op、Txn、Watch 基础概念说明)
- Windows下MemCache多端口安装配置
- cli3暴露api地址 vue_手把手教你开发 Vue 组件库
- MongoDB实战(4)MapReduce
- 【原译】简单的Malloc实现
- 修改CMD设置使其支持鼠标选择复制
- darknet迭代多少次_STL:迭代器
- 转:[kipmi0]进程导致系统负载高
- axios post object object_深入学习Axios源码(构建配置)
- 量子计算机概念谁提出来,目前的量子计算机从根本上来说是一个伪概念
- 用Python解决简单的水果分类问题(二)
- VUE day_08(7.26)学子商城项目详细版
- 游戏制作大师RPGMAKER MV/MZ安装DLC的方法
- Chrome断点调试
- Android开发获取连接的WIFI名称
- Ruoyi框架学习总结--总览篇
- 太吾绘卷第一世攻略_太吾绘卷狮相门第一世打通7剑冢攻略
- 如何使用QQ号来注册腾讯云新用户账号并完成实名认证?
- 新年伊始 沐圣moolsun强势来袭
- VR全景车展提升产品透明度让消费者更加信赖
热门文章
- 【51单片机实验笔记】3. LED点阵的基本控制
- 什么是网络推广以及如何做好网络推广
- ElasticSearch 数据迁移
- 实验三 XSS和SQL注入
- Mapped Statements collection does not contain value for 解决方法
- 数据库视图的基本操作(sql语句)
- 微信小程序-如何申请百度开放平台的密钥
- 鸿蒙系统就是个垃圾系统,华为鸿蒙系统是什么?鸿蒙系统和安卓系统有什么区别?...
- python阶梯图_Python制图你真的会吗?一文学会如何绘制漂亮的阶梯图
- 按照前序遍历创建二叉树及树的四种遍历方式