转自 https://www.cnblogs.com/xubing-613/p/5895948.html
首先,我们来绘制一个figure对象。
立马就会生成一个这样的窗口:
好,这是第一步。
但是不能通过空figure绘图。必须使用add_subplot()创建一个或多个subplot才行。
看以上三行代码,figure变成了这样:
这三行代码的意思是:图像是2X2的,且当前选中是4个中的第n个。(222)就是2X2 中的第二2,(2,2,3)就是2X2中的第三个。可分割也可不分割,当超过10的话需要分割了吧。
好,第二步也成功做完了。接下来,发出一条绘图命令。如plt.plot([1.5, 2, 4, -2, 1.6]) #绘制几个点连接
我们来试一下。
恩,此时matplotlib就会在最后一个用过的subplot(如果没有则创建一个)上面进行绘制。
这几步完成的还不错吧,那下面我们再进一步探索。
*************************************************分割线****************************************************
我们运行一下这两行代码:
from numpy.random import randn #导入随机模块
plt.plot(randn(50).cumsum(), 'k--')
其实就是在0到50随机生成一个数组,然后绘制在最后一个用过的subplot里面,注意是线段类型,虚线。
那如何绘制图像在其他的subplot里面呢?下面就演示如何做。
ax1.hist(randn(100), bins = 20, color = 'k', alpha = 0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * randn(30))
至此,应该能非常熟练的在figure对象中绘图了吧。
还可以在matplotlib的文档中找到各种图表类型。
**********************************************分割线**********************************************************
由于根据特定布局创建Figure和subplot是一件很常见的任务,于是便出现了一个更为方便的方法。
fig, axes = plt.subplots(2, 3)
这样,一步就完成上节两步完成的工作。
-----------------------------------------------------------------------
pyplot.subplots有几个选项
nrows:subplot的行数
ncols:subplot的列数
sharex:所有subplot共享x轴刻度
sharey:所有subplot共享Y轴刻度
subplot_kw:用于创建各subplot的关键字字典
**fig_kw:创建figure时的其他关键字,如plt.subplots(2,2,figuresize=(8,6))
-------------------------------------------------------------------------
加了参数,共享x轴y轴。
我们再试着调整一下subplot周围的边距。
Figure有一个顶级函数subplot_adjust。
subplots_adjust(left = None, bottom = None, right = None, top = None, wsapce = None, hspace = None )
wspace 和 hspace是控制宽度和高度的百分比。下面将间距收缩到了0.
又是新知识吧。接下来,学习颜色和线型。
************************************分割线**************************************************
新建一个fig
fig = plt.plot()
再新建一个fig
data = randn(30).cumsum()
plt.plot(data, 'k--', label = 'Default')
plt.plot(data, 'k-', drawstyle = 'steps-post', label = 'steps-post')
plt.legend(loc='best') #在合适的位置放置图例。
设置标题,轴标签,刻度以及刻度标签。
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(randn(1000).cumsum())
随机漫步。我们来给上图添加标签。
ticks = ax.set_xtickets([0, 250, 500, 750, 1000])
可以看出,x标签变成我们制定的标签。y轴标签可想而知了。
再来设置title
ax.set_title('My First matplotlib plot')
再用set_xlabel为X轴设置一个名称。
ax.set_xlabel('Stages')
Y轴的跟X轴几乎是一样的。再小白也能看懂吧。
添加图例(legend):
上面两张图是一样的,后面只是上面图放大了,注意图例的位置。
ax.legend(loc = 'best') #会选择一个最不碍事的位置。
要从图例中去除一个或多个元素,不传入label或传入lable = '_nolegend_'
还有一些这样的选项。
***************************************************分割线*****************************************************
又上一层楼。 嘻嘻。
好了,一口气写这么些,后面的再慢慢更新吧。
今天接着入门,白小白可以看,大神绕路。
***************************************************分割线*****************************************************
今天接着入门,白小白可以看,大神绕路。
今天以画图开始。
画个长方形,三角形,圆形(椭圆)。
Matplotlib有一些表示常见图形的对象,这些对象被称为块(patch)。完整的集合位于matplotlib.patches。
fig = plt.figure()
ax = fig.add_subplot(111)
rect = plt.Rectangle((0.2,0.75), 0.4, 0.15, color = ‘r’, alpha = 0.3)#左下起点,长,宽,颜色,α
circ = plt.Circle((0.7,0.2), 0.15, color = ‘b’, alpha = 0.5)#圆心,半径,颜色,α
pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]], color = ‘g’, alpha = 0.5 )#顶点坐标颜色α
α表示的是图表的填充不透明度。在(0,1)之间。
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
补充一个:如何在图上指定位置添加文本、箭头,或其他图形呢?
答:可以通过text、arrow、annotate等函数进行添加。下面看一个添加文本的例子。
ax.text(0.7, 0.6, ‘Hello World!’, family = ‘monospace’, fontsize = 10)
可以看到图片里面指定位置有我们添加的文字信息。
那生成了图表文件怎么保存呢?
利用plt.savefig可以将当前图表保存到文件。
Plt.savefig(‘figpath.svg’, dpi = 400, bbox_inches = ‘tight’ )
#文件类型是通过文件扩展名推断出来的,可以保存为.pdf.
Dpi是 ‘每英寸点数’分辨率,bbox_inches可以剪除当前图表周围的空白部分
保存到了一个.pdf的文件中。
Figure.savefig有一下选项:
Fname: 含有路径的字符串或python文件型对象。.pdf,.png根据扩展名推断得出。
dpi: 图像分辨率(每英寸点数),默认为100
facecolor,edgecolor: 图像的背景色,默认为‘w’(白色)
format: 显式设置文件格式(‘png’,‘pdf’,‘svg’,‘ps’,‘eps’…)
bbox_inches:图表需要保存的部分。如果设置为‘tight’,则尝试剪除图表周围的空白部分。
***********************分割线********************************
Matplotlib实际上是一种比较低级的绘图工具。要组装一章图表,你得用它的各种基础组件才行。下面介绍一下pandas中的绘图函数。简单入门级别的集中。
************************分割线*******************************
线型图:
Series和DataFrame都有一个用于生成各类图表的plot方法。默认情况下,他们所生成的是线型图。
s = Series(na.random.randn(10).cumsum(), index = np.arange(0,100,10))
s.plot()
pyplot介绍
matplotlib.pyplot是一个有命令风格的函数集合,它看起来和MATLAB很相似。每一个pyplot函数都使一副图像做出些许改变,例如创建一幅图,在图中创建一个绘图区域,在绘图区域中添加一条线等等。在matplotlib.pyplot中,各种状态通过函数调用保存起来,以便于可以随时跟踪像当前图像和绘图区域这样的东西。绘图函数是直接作用于当前axes(matplotlib中的专有名词,图形中组成部分,不是数学中的坐标系。)
举一个简单的例子:
- 1
- 2
- 3
- 4
运行结果
你可能会很疑惑X和Y轴为什么是0~3和1~4。原因是这样的,这里我们只是为plot()命令提供 了一个list或者是array,matplotlib就会假设这个序列是Y轴上的取值,并且会自动为你生成X轴上的值。因为python中的范围是从0开始的,因此X轴就是从0开始,长度与Y的长度相同,也就是[0,1,2,3]。
plot()是一个灵活的命令,它的参数可以是任意数量,比如:
- 1
这表示的是(x,y)对,(1,1)(2,4)(3,9)(4,16)。这里有第三个可选参数,它是字符串格式的,表示颜色和线的类型。该字符串格式中的字母和符号来自于MATLAB,它是颜色字符串和线的类型字符串的组合。默认情况下,该字符串参数是’b-‘,表示蓝色的实线。
举一个使用红色圆圈绘制上述点集的例子:
- 1
- 2
- 3
- 4
可以查看plot()的文档,那里有完整的关于线的类型的说明。axis()命令可以方便的获取和设置XY轴的一些属性。
如果matplotlib仅限于使用上面那种list,那么它将显得毫无用处。通常,我们都是使用numpy数组,实际上,所有的序列都将被在内部被转化成numpy数字。下面的例子是使用一个命令用几种不同风格的线绘制一个数组:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
控制线的属性
线有许多属性可以设置:线宽、线的形状,平滑等等。这里有一些设置线属性的方法:- 使用关键字参数
- 1
- 对线对象(Line2D)使用set_方法,plot()会返回一个线对象的列表,比如line1, line2 = plot(x1, y1, x2, y2)。下面的代码我们将假设我们只有一条线,即返回的线对象列表的长度为1。
- 1
- 2
- 使用setp()命令。 下面的例子使用的是MATLAB风格的命令去设置一个线的列表的多个属性。setp()可以作用于一个列表对象或者是一个单一的对象。你可以使用python风格的关键字参数或者是MATLAB风格的string/value对为参数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
这是一些Line2D的属性和取值:
工作在多图形(figures)和多坐标系(axes)
MATLAB和pyplot都有当前图形(figure)和当前坐标系(axes)的概念。所有的绘图命令都是应用于当前坐标系的。gca()和gcf()(get current axes/figures)分别获取当前axes和figures的对象。通常,你不用担心这些,因为他们都在幕后被保存了,下面是一个例子,创建了两个子绘图区域(subplot):- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
figure()命令在这儿可以不写,因为figure(1)将会被默认执行,同样,subplot(111)也是默认被执行的。subplot()中的参数分别指定了numrows、numcols、fignum,其中fignum的取值范围为1到numrows*numcols,分别表示的是将绘图区域划分为numrows行和numcols列个子绘图区域,fignum为当前子图的编号。编号是从1开始,一行一行由左向右编号的。其实subplot中的参数【111】本应写作【1,1,1】,但是如果这三个参数都小于10(其实就是第三个参数小于10)就可以省略逗号。你可以创建任意数量的子图(subplots)和坐标系(axes)。如果你想手动放置一个axes,也就是它不再是一个矩形方格,你就可以使用命令axes(),它可以让坐标系位于任何位置,axes([left,bottom,width,height]),其中所有的值都是0到1(axes([0.3,0.4,0.2,0.3])表示的是该坐标系位于figure的(0.3,0.4)处,其宽度和长度分别为figure横坐标和纵坐标总长的0.2和0.3)。其实subplot和axes的区别就在于axes大小和位置更加随意。
你可以创建多个figure,通过调用figure(),其参数为figure的编号。当然每个figure可以包含多个subplot或者是多个axes。例子:- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
我们可以使用clf()和cla()(clear current figure/axes)清除当前figure和当前axes。
如果你创建了许多figures,你需要注意一件事:figure的内存直到显示调用close()函数才会被完全释放,否则它并没有被全部释放。如果只是删掉对figure的引用,或者是通过关闭window进程管理器关闭该figure,这都是不完全删除figure的,因为pyplot在内部维持了一个引用,直到close()被调用。文字
text()命令可以被用来在任何位置添加文字,xlabel()、ylabel()、title()被用来在指定位置添加文字。- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
所有text()命令返回一个matplotlib.text.Text实例,像上面的线一样,可以通过关键字参数在text()定制文本样式,也可以通过setp()来定制文字的样式:- 1
- 2
- 在文本中使用数学表达式
matplotlib接受任何TeX方程表达式,比如,你可以写成用”$”符号包裹的TeX表达式:
- 1
这里的”r”非常重要,它表示后面的字符串是一个纯粹的字符串,不会将后面的反斜杠当作转义字符。matplotlib内置有TeX表达式解释器和排版引擎,和自带的数学字体。因此你可以不用安装TeX就能使用数学表达式,如果你安装了LaTeX和dvipng,你也可以使用LaTex排版你的文字并且直接输出到figures或者是保存。
- 注释文本
使用text()命令可以在Axes中任意位置放置文本,一个普遍的文本用法是对一些特性进行注释,annotate()方法让添加注释变得很容易。对于注释有两点需要注意:需要被注释的地方,使用xy参数来指出,还有就是注释文本所放置的位置,使用参数xytext来指定位置,这两个参数都使(x,y)元组:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
这里的xy和xytext所使用的坐标是根据XY轴的刻度的坐标,称为data coordinates。当然也可以使用其他坐标系统,具体参考官方文档。对数和其他非线性坐标轴(axis)
matplotlib.pylot不仅仅提供了线性的坐标,还提供了对数(logarithmic)和分对数(logit)坐标。当数据的维度跨越许多数量级时,这种坐标就很有用,改变坐标轴的刻度很容易:- 1
下面是一个例子,对于同样的数据,在Y轴使用不同刻度下的曲线图:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
我们也可以添加自己的刻度和投影。具体这里先不介绍,后续会深入讲解更多matplotlib的用法。