Python数据分析 笔记4(matplotlib库)

参考书籍 《利用Python进行数据分析(原书第2版)》9.1 简明matplotlib API入门

导入惯例 -> import matplotlib.pyplot as plt

9.1.1 图片与子图

【例】创建一个图片对象,包含2x2个子图

In [1]: import matplotlib.pyplot as plt
In [2]: import numpy as np
In [3]: import pandas as pd
In [4]: matplotlib
Using matplotlib backend: TkAgg

In [5]: fig = plt.figure()
In [6]: ax1 = fig.add_subplot(2,2,1)
In [7]: ax2 = fig.add_subplot(2,2,2)
In [8]: ax3 = fig.add_subplot(2,2,3)

说明:
In [4]   在Jupyter中运行%matplotlib notebook(或在IPython中运行%matplotlib)
In [5]   matplotlib所绘制的图位于图片(Figure)对象中,使用plt.figure生成一个新的图片
In [6]   不能使用空白的图片进行绘图,需要使用add_subplot创建一个或多个子图(subplot)
           该行代码表示图片应该是2×2的(最多四个图形),并且我们选择了四个图形中的第一个(序号从1开始)



In [51] 当你输入绘图命令plt.plot(), matplotlib会在最后一个图片和子图(如果需要的话就创建一个)上进行绘制

注意:如果一开始没有执行matplotlib,图片不显示可以使用命令plt.show(),如果希望图片自动弹出则执行plt.ion()。如果一开始执行了matplotlib,再执行plt.ioff()图片也不会自动弹出。

参考 : 在使用ipython的时候matplotlib无法自动显示图片 https://blog.csdn.net/u013613428/article/details/89133495

 

matplotlib包含了一个便捷方法plt.subplots -> 创建一个新的图片,返回包含了已生成子图对象的NumPy数组

In [11]: fig, axes = plt.subplots(2,3)  => 回车后弹出图片

In [12]: axes
Out[12]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F66247F48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AA10E48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AA4B308>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AA7BE88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AAB1948>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AAE7648>]],
      dtype=object)

 

@调整子图周围的间距(subplots_adjust方法)
可以用作图对象上的方法、也可以用作顶层函数
subplots_adjust(left=None, bottom=None, right=None, top=None,wspace=None, hspace=None)
wspace和hspace分别控制的是图片的宽度和高度百分比,以用作子图间的间距。
【例】关注参数sharex和sharey,wspace和hspace

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)

说明:sharex、sharey设置为True会共享轴刻度数据;wspace、hspace设置为0四个图会贴在一起

接着将wspace、hspace设置为1(100%)->横向间距100%图片宽度,纵向间距100%图片高度

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=1, hspace=1)

再看看将sharex、sharey设置为False -> 每个子图有独立的座标轴
将wspace、hspace设置为0.5(50%) -> 横向间距50%图片宽度,纵向间距50%图片高度

fig, axes = plt.subplots(2, 2, sharex=False, sharey=False)
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.5, hspace=0.5)

9.1.2 颜色、标记和线类型

以下两种表达等价
ax.plot(x, y, 'g--')
ax.plot(x, y, linestyle='--', color='g')

说明:有很多颜色缩写被用于常用颜色,也可以通过指定十六进制颜色代码的方式来指定颜色(例如’#CECECE')
参考plot函数的文档字符串可以看到全部的线类型(在IPython或Jupyter中使用 plt.plot? )

【例】

In [20]: from numpy.random import randn
In [21]: plt.plot(randn(30).cumsum(), 'ko--')
Out[21]: [<matplotlib.lines.Line2D at 0x13f70fe3288>]

上面的代码可以写得更为显式:
plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')
说明:标记可以用来突显线图的实际数据点。样式字符串中线类型、标记类型必须跟在颜色后面。

9.1.3 刻度、标签和图例

pyplot接口设计为交互式使用,包含了像xlim、xticks和xticklabels等方法。分别控制了绘图范围、刻度位置以及刻度标签。

我们可以在两种方式中使用:
-  在没有函数参数的情况下调用,返回当前的参数值(例如plt.xlim()返回当前的x轴绘图范围)
-  传入参数的情况下调用,并设置参数值(例如plt.xlim([0, 10])会将x轴的范围设置为0到10)
所有的这些方法都会在当前活动的或最近创建的AxesSubplot上生效。这些方法中的每一个对应于子图自身的两个方法。比如xlim对应于ax.get_lim和ax.set_lim。

@设置标题、轴标签、刻度和刻度标签
【例】随机漫步

In [24]: fig = plt.figure()
In [25]: ax = fig.add_subplot(1, 1, 1)
In [26]: ax.plot(np.random.randn(1000).cumsum())
Out[26]: [<matplotlib.lines.Line2D at 0x13f6ec47108>]

使用set_xticks和set_xticklabels可以改变x轴刻度。
set_xticks表示在数据范围内设定刻度的位置,默认情况下,这些刻度也有标签。

ticks = ax.set_xticks([0, 250, 500, 750, 1000])   =>

使用set_xticklabels为标签赋值:labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],rotation=30, fontsize='small')


 

说明:rotation选项会将x轴刻度标签旋转30度

使用set_xlabel给x轴一个名称,使用set_titel给子图一个标题 => 
ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')

修改y轴座标是相同过程,将上面示例中的x替换成y即可。

轴的类型拥有一个set方法,允许批量设置绘图属性。

In [43]: props = {
    ...:     'title': 'My first matplotlib plot update',
    ...:     'ylabel': 'Distance'
    ...:     }
    ...: ax.set(**props)
Out[43]:
[Text(35.347222222222214, 0.5, 'Distance'),
 Text(0.5, 1.0, 'My first matplotlib plot update')]

 

@添加图例
图例是用来区分绘图元素的另一个重要内容,有多种方式可以添加图例。
最简单的方式是在添加每个图表时传递label参数:

In [9]: fig,ax = plt.subplots(1, 1)

In [10]: ax.plot(randn(1000).cumsum(), 'k', label='one')
Out[10]: [<matplotlib.lines.Line2D at 0x27ce056ec88>]
In [11]: ax.plot(randn(1000).cumsum(), 'k--', label='two')
Out[11]: [<matplotlib.lines.Line2D at 0x27ce05a7cc8>]
In [12]: ax.plot(randn(1000).cumsum(), 'k.', label='three')
Out[12]: [<matplotlib.lines.Line2D at 0x27ce05c5148>]

In [13]: ax.legend(loc='best') 
Out[13]: <matplotlib.legend.Legend at 0x27ce05c1288>

说明:调用ax.legend()或plt.legend自动生成图例。
loc参数告诉matplotlib在哪里放置图表。'best'会自动选择最合适的位置。
如果取消图例中的元素,不要传入label参数或者传入label='_nolegend_'。
关于legend方法位置参数loc,使用ax.legend? 查看更多信息。

9.1.4 注释与子图加工

可以使用text、arrow和annote方法来添加注释和文本。
text在图表上给定的座标(x, y),根据可选的定制样式绘制文本。
注释可以同时绘制文本和箭头,ax.annotate方法可以在指定的x和y座标上绘制标签。

matplotlib含有表示多种常见图形的对象,这些对象的引用是patches。
想在图表中添加图形时,你需要生成patch对象shp,并调用ax.add_patch(shp)将它加入到子图中。
【例】绘制矩形、圆、三角形
矩形:左下顶点(0.2,0.75),长0.5,高0.15
圆:圆心(0.2,0.75),半径0.15
三角形:给出三个顶点的位置
alpha代表不透明度(0-> 透明,1-> 不透明)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
pgon = plt.Polygon([[0.2, 0.2], [0.4, 0.4], [0.3, 0.6]],color='g', alpha=0.5)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

 

 

 

 

 

 

 

 

 

9.1.5 将图片保存到文件

可以使用plt.savefig将活动图片保存到文件。这个方法等价于图片对象的savefig实例方法。
【例】将图片保存为SVG  =>   plt.savefig('figpath.svg')

说明:
1.文件类型是从文件扩展名中推断出来的。
2.一些选项
dpi -> 控制每英寸点数的分辨率
bbox_inches -> 修剪实际图形的空白

为了得到同样一个PNG图片,且使用最小的空白,拥有400 DPI =>
plt.savefig('figpath.png', dpi=400, bbox_inches='tight')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章