matplotlib架构分为三层:各层之间单向通讯,即每一层只能与它的下一层通讯,而下层没法与上层通讯。编程
Scripting(脚本)层:后端
Artist(变现层):数组
Backend(后端层):网络
在matplotlib的架构中,最下面一层为 Backend层。 matplotlib API即位于该层,这些是用来在底层实现图形元素的一个个类。架构
FigureCanvas对象实现了绘图区域这一律念。框架
Renderer对象在 Figure Canvas上绘图dom
Event对象处理用户输入(键盘和鼠标事件)。ide
中间层为 Artist,层。图形中全部能看到的元素都属于 Artist对象,即标题、轴标签、刻度等组成图形的全部元素都是 Artis对象的实例。函数
Artist类分为两种:原始(primitive)和复合(composite)工具
绘制Line2D或矩形、圆形等几何图形,甚至文本等图形时,造成图形表示的基础元素由primitive artist单个对象组成。
由多个基础元素primitive artist
组成的图表中的图像元素叫做 composite artist,
Figure对象在 Artist层的最上面,对应整个图形表示,一般可包含多条轴(Axes)
Axes对象一般表示图形或图表是对什么内容进行做图的。每一个Axes对象只属于一个Figure对象,由两个(三维就有三个) Artist axis对象组成。标题、x标签和y标签等对象都属于Axes这个composite artist类型的对象。
Axis对象负责展现在Axes对象上面的数值,定义数值范围,管理刻度(轴上的标记)和刻度值标签(表明每一个刻度大小的文本标签)。刻度的位置用 Locator对象调整,刻度标签的格式用Formatter对象调整。
from pylab import * import matplotlib.pyplot as plt import numpy as np
pylab在同一命名空间整合了 pyplot和 NumPy的功能,所以无需再单独导入 NumPy。更进一步来讲,导人 pylab后, pyplot和 NumPy的函数就能够直接调用,而不用再指定其所属模块(命名空间),从而使得 matplotlib开发环境更像是 Matlab。
pyplot模块提供操做 matplotlib库的经典 Python编程接口,有着本身的命名空间,须要单独导入NumPy库
经过pyplot函数能够操做或改动 Figure对象,例如建立 Figure对象和绘图区域、表示一条线或为图形添加标签等。
pyplot还具备状态性特性,它能跟踪当前图形和绘图区域的状态。调用函数时,函数只对当前图形起做用。
生成一幅简单的交互式图表
import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show()
1.用红点来表示每一对(x,y)
import matplotlib.pyplot as plt plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
2.title()函数增长标题。
plt.axis([0,5,0,20]) plt.title('The first') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
3.如何在同一图形中绘制三种不一样的趋势图.
这些关键字做为参数传递给函数。在matplotlib库各个函数的参考文档中,每一个函数的最后个参数老是 kwargs。
matplotlib.pyplot.plot(*args, **kwargs)
所以,使用 pyplot时,必须时刻注意当前 Figure对象和当前Axes对象的概念(也就是 Figure对象中当前所显示的图形)
一幅图形中有两个子图
subplot(函数不只能够将图形分为不一样的绘图区域,还能激活特定子图,以便用命令控制它。
subplot()函数用参数设置分区模式和当前子图。只有当前子图会受到命令的影响。
subplot()函数的参数由三个整数组成:第一个数字决定图形沿垂直方向被分为几部分,第二个数字决定图形沿水平方向被分为几部分,第三个数字设定能够直接用命令控制的子图。
把画布分为上下两个向水平方向延伸的子图
import matplotlib.pyplot as plt import numpy as np t = np.arange(0,5,0.1) y1= np.sin(2*np.pi*t) y2= np.sin(2*np.pi*t) plt.subplot(211) plt.plot(t, y1, 'b-') plt.subplot(212) plt.plot(t,y2, 'r--') plt.show()
t = np.arange(0,5,0.1) y1= np.sin(2*np.pi*t) y2= np.sin(2*np.pi*t) plt.subplot(121) plt.plot(t, y1, 'b-') plt.subplot(122) plt.plot(t,y2, 'r--') plt.show()
plt.axis([0,5,0,20]) plt.title('The first') plt.xlabel('Counting') plt.ylabel('Square Values') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
text(x, y, s, fontdict=None, **kwargs)
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
将表达式内容置于两个符号之间,可在文本中添加 LaTeX表达式。解释器会将该符号之间的文本识别成 LaTex表达式,把它们转换为数学表达式、公式、数学符号或希腊字母等,而后在图像中显示出来。一般,须要在包含LaTeX表达式的字符串前添加r字符,代表它后面是原始文本,不能对其进行转义操做。
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2})#添加公式 plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
plt.grid(True)
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2}) plt.grid(True) plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.legend(['first serises']) plt.show()
一处位置,默认为1,也就是右上角位置。
0:最佳位置
1:右上角
2:左上角
3:右下角
4:左下角
5:右侧
6:左侧垂直居中
7:右侧垂直居中
8:下方水平居中
9:上方水平居中
10:正中间
注意:一般,图例经过标签、颜色和(或)符号向读者代表这是哪个序列,应该与其余序列区分开来。在前面全部的例子中,咱们只使用了由一个p1ot()函数绘制的单个序列。
plt.axis([0,5,0,20]) plt.title('The first',fontsize=20,fontname='Times New Roman' ) plt.text(1,1.5,'first') plt.text(2,4.5,'second') plt.text(3,9.5,'third') plt.text(4,16.5,'fourth') plt.text(1.1,12, r'$y = x^2$',fontsize=20,bbox={'facecolor':'yellow','alpha': 0.2}) plt.grid(True) plt.xlabel('Counting',color='gray' ) plt.ylabel('Square Values',color='gray') plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.plot([1,2,3,4],[0.8,3.5,8,15],'g^') plt.plot([1,2,3,4],[0.5,2.5,4,12],"b*") plt.legend(['first series','second series','third series'],loc=2) plt.show()
保存代码
将回话转化成HTML
将图表直接转化成图片
plt.savefig('mychart.png')
注意:保存成图像的命令以前不要使用plt.show(),不然将获得空白图像。
import datetime events=[datetime.date(2015, 1, 23), datetime.date(2015, 1, 28), datetime.date(2015, 2, 3), datetime.date(2015, 2, 21), datetime.date(2015, 3, 15), datetime.date(2015, 3, 24), datetime.date(2015, 4, 8), datetime.date(2015, 4, 24)] readings=[12,22,25,20,18,15,17,14] plt.plot(events, readings) plt.show()
若是让 matplotlib自动管理刻度,尤为是刻度的标签,其后果无疑是一场灾难。以这种方式显示日期时,可读性不好,两个数据点之间的时间间隔不清晰,而且还存在重影现象。建议用合适的对象,定义时间尺度来管理日期。
首先须要导入matplotlib.dates模块,该模块专门用于管理日期类型的数据。而后,定义时间尺度。下面例子中,用 Monthlocator()和 DayLocator()函数,分别表示月份和日子。
日期格式也很重要,要避免出现重影问题或显示无效的日期数据,只显示必要的刻度标签就好。咱们这里只显示年月,把这种格式做为参数传给
DateFormatter()函数。
import datetime import numpy as np import matplotlib. pyplot as plt import matplotlib.dates as mdates months = mdates.MonthLocator() days= mdates. DayLocator() timeFmt = mdates.DateFormatter('%Y-%m') events = [datetime. date(2015, 1, 23), datetime.date(2015, 1, 28), datetime.date(2015, 2, 3), datetime.date(2015, 2, 21), datetime.date(2015, 3, 15), datetime.date(2015, 3, 24), datetime.date(2015, 4, 8), datetime.date(2015, 4, 24)] readings=[12,22,25,20,18,15,17,14] fig, ax= plt.subplots() plt.plot(events, readings) ax.xaxis.set_major_locator(months) ax.xaxis.set_major_formatter(timeFmt) ax.xaxis.set_minor_locator( days) plt.show()
y=sin(3*x)/x 图像
import matplotlib.pyplot as plt import numpy as np x = np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x plt.plot(x,y) plt.show()
y=sin(n* x)/x的图像
x = np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x y1=np.sin(4*x)/x y2=np.sin(5*x)/x plt.plot(x,y) plt.plot(x,y1) plt.plot(x,y2) plt.show()
能够用plot(函数的第三个参数指定颜色/线型,把这些设置所用的字符编码放到同一个字符串便可。
还可使用两个单独的关键字参数,用 color指定颜色,用 linestyle指定线型
| 编码 | 颜色 |
| :--- | :--- |
| b | 蓝色 |
| g | 绿色 |
| r | 红色 |
| c | 蓝绿色 |
| m | 洋红 |
| y | 黄色 |
| k | 黑色 |
| w | 白色 |
x轴的数值范围为-2π~2π,可是刻度标签默认使用数值形式须要用π的倍数代替数值。
同理,能够替换y轴刻度的标签。方法是使用 sticks()和 sticks()函数,分别为每一个函数传入两列数值。第一个列表存储刻度的位置,第二个列表存储刻度的标签。
import matplotlib.pyplot as plt import numpy as np x = np.arange(-2*np.pi,2*np.pi,0.01) y=np.sin(3*x)/x y1=np.sin(4*x)/x y2=np.sin(5*x)/x plt.plot(x,y,color='b') plt.plot(x,y1,color='r') plt.plot(x,y2,color='g' ) plt.xticks([-2*np.pi,-np.pi,0,np.pi,2*np.pi], [r'$-2\pi$',r'$-\pi$',r'$0$',r'$+\pi$',r'$+2pi$']) plt.yticks([-1,0,+1,+2,+3], [r'$-1$',r'$ 0 $',r'$+1$',r'$+2$',r'$+3$']) plt.show()
前面的全部线性图中,x轴和轴老是置于 Figure的边缘(跟图像的边框重合)
另一种显示轴的方法是,两条轴穿过原点(0,0),也就是笛卡儿坐标轴。
具体作法是,首先必须用gca()函数获取Axes对象。接着经过这个对象,指定每条边的位置:右、左、下和上,可选择组成图形边框的每条边。使用 set_color()函数,把颜色设置为none,删除跟坐标轴不符合的边(右和上)。而后,用 set_position()函数移动跟x轴和轴相符的边框,使其穿过原点(0,0)
ax.spines['right']. set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))
用注释和箭头(可选)明曲线上某一数据点的位置,这一功能很是有用。例如,能够用 LaTeX表达式做为注释,好比添加表示x趋于0时函数 sinx/x的极限的公式。
matplotlib库的 annotate()函数特别适用于添加注释。虽然它有多个关键字参数,这些参数可改善显示效果,可是参数设置略显繁琐,也就使得 annotate()函数看似有些麻烦。
第一个参数为含有 LaTex表达式、要在图形中显示的字符串;
随后是各类关键字参数。注释在图表中的位置用存放数据点[x,y]坐标的列表来表示,需把它们传给xy关键字参数。
文本注释跟它所解释的数据点之间的距离用xytext关键字参数指定,用曲线箭头将其表示出来。
箭头的属性则由arrowprops关键字参数指定。
plt.annotate(r'$\lim_{x\to 0}\frac{\sin()}{x}= 1$', xy=[0, 1], xycoords='data', xytext=[30, 30], fontsize=16, textcoords='offset points', arrowprops=dict(arrowstyle="->", connectionstyle="arc, rad= 2"))
-将DataFrame中的数据作成线性图表很简单,只需把 DataFrame做为参数传入plot()函数,就能获得多序列线性图。
import matplotlib.pyplot as plt import numpy as np import pandas as pd data = { 'series1':[1,3,4,3,5], 'series2':[2,4,5,2,4], 'series3':[3,2,3,1,3]} df = pd.DataFrame(data) x = np.arange(5) plt.axis([0,5,0,7]) plt.plot(x,df) plt.legend(data,loc=2) plt.show()
pyplot用于绘制直方图的函数为hist(),该函数具备一个其余绘图函数所没有的功能。它除了绘制直方图外,还以元组形式返回直方图的计算结果。事实上,hist()函数还能够实现直方图的计算。也就是说,它可以接收一系列样本个体和指望的面元数量做为参数,会把样本范围分红多个区间(面元),而后计算每一个面元所包含的样本个体的数量。运算结果除了以图形形式表示外,还能以元组形式返回。
例子
pop = np.random.randint(0,100,100) n,bins,patches = plt.hist(pop,bins=20) plt.show()
index = [0,1,2,3,4] values = [5,7,3,4,6] plt.bar(index,values) plt.show()
index = np.arange(5) values = [5,7,3,4,6] plt.bar(index,values) plt.xticks(index,['A','B','C','D','E']) plt.show()
还能够借助不少其余步骤进一步改进条状图。每一种改进方法都是经过在bar()函数中添加特定的关键字参数来实现的。
例如,把包含标准差的列表传给yerr关键字参数,就能添加标准差。这个参数常跟error_kw参数一块儿使用,然后者又接收其余可用于显示偏差线的关键字参数。
经常使用的两个是 eColor和 capsize, eColor指定偏差线的颜色,而 capsize指定偏差线两头橫线的宽度。
还有一个参数叫做 alpha,它控制的是彩色条状图的透明度。 alpha的取值范围为0-1。0表示对象彻底透明,随着alpha值的增长,对象逐渐清晰起来,到1时,颜色显示全了。
带有偏差线的条状图
index = np.arange(5) values = [5,7,3,4,6] std1 = [0.8,1,0.4,0.9,1.3] plt.title('A bar Chart') plt.bar(index,values,yerr=std1,error_kw={'ecolor':'0.1', 'capsize':6},alpha=0.7,label='First') plt.xticks(index,['A','B','C','D','E']) plt.show()
轴的用途跟垂直条状图恰好相反。水平条状图中,类别分布在轴上,数值显示在x轴。
index = np.arange(5) values = [5,7,3,4,6] std1 = [0.8,1,0.4,0.9,1.3] plt.title('A Horizontal bar Chart') plt.barh(index,values,xerr=std1,error_kw={'ecolor':'0.1', 'capsize':6},alpha=0.7,label='First') plt.yticks(index,['A','B','C','D','E']) plt.show()
条,就将其分为几部分。建议再增长一个额外的空间,以便区分两个相邻的类别。
index = np.arange(5) values1 = [5,7,3,4,6] values2 = [6,6,4,5,7] values3 = [5,6,5,4,6] bw = 0.3 plt.axis([0,5,0,8]) plt.title('A Multiseries Bar Chart',fontsize=20) plt.bar(index,values1,bw,color='b') plt.bar(index+bw,values2,bw,color='g') plt.bar(index+2*bw,values3,bw,color='r') plt.xticks(index+1.5*bw,['A','B','C','D','E']) plt.show()
index = np.arange(5) values1 = [5,7,3,4,6] values2 = [6,6,4,5,7] values3 = [5,6,5,4,6] bw = 0.3 plt.axis([0,8,0,5]) plt.title('A Multiseries Bar Chart',fontsize=20) plt.barh(index,values1,bw,color='b') plt.barh(index+bw,values2,bw,color='g') plt.barh(index+2*bw,values3,bw,color='r') plt.yticks(index+1.5*bw,['A','B','C','D','E']) plt.show()
data = { 'series1':[1,3,4,3,5], 'series2':[2,4,5,2,4], 'series3':[3,2,3,1,3]} df = pd.DataFrame(data) df.plot(kind='bar',stacked=True) plt.show()
另一种很是有用的图形表示法是用条状图表现对比关系。两列有着共同类别的数据,其条状图形分列于x轴两侧,沿y轴方向生长。
要生成这类图形,需事先对其中一个序列的y值进行取相反数操做
如何修改条状图的边框和条状图内部区域的颜色。其实,只要用另外两个关键字参数 facecolor和 edgecolor设置两种不一样的颜色便可。
如何在每一个长条的末端显示ν值标签,这有助于加强条状图的可读性。可使用for循环,在循环体内再借助text()函数显示y值标签。标签的位置可用ha和va关键字参数来调整,它们分别控制着标签在水平和垂直方向上的对齐效果。
x0 = np.arange(8) y1 = np.array([1,3,4,6,4,3,2,1]) y2 = np.array([1,2,3,4,3,3,2,1]) plt.ylim(-7,7) plt.bar(x0,y1,0.9,facecolor='r',edgecolor='w') plt.bar(x0,-y2,0.9,facecolor='b',edgecolor='w') plt.xticks(()) plt.grid(True) for x ,y in zip(x0,y1): plt.text(x+0.4,y+0.05,'%d' %y,ha='center',va='bottom') for x ,y in zip(x0,y2): plt.text(x+0.4,-y-0.05,'%d' %y,ha='center',va='top') plt.show()
饼图也能够用来表示数据。用pie(函数制做饼图很简单。
该函数仍然以要表示的一列数据做为主要参数。这里直接选用百分比(总和为100),能够选用每种类别的实际数值,而让pie(函数本身去计算每一个类别所占的比例。
对于这类图表,仍需用关键字参数设置关键特征。例如,若要定义颜色列表,为做为输入的数据序列分配颜色,可以使用 colors关键字参数,把颜色列表赋给它。另一个重要的功能是为饼图的每一小块添加标签,为此需使用 labels关键字参数,把标签列表赋给它。此外,为了绘制标准的圆形饼图,还须要在代码最后调用axis()函数,用字符串' equal'做为参数。
labels=['Nokia','Samsung','Apple', 'Lumia'] values=[10,30,45,15] colors=['yellow','green','red', 'blue'] plt.pie(values,labels=labels,colors=colors) plt.axis('equal') plt.show()
然是一个完整的圆;而0~1的值则表示这一块未彻底脱离饼图。
labels=['Nokia','Samsung','Apple', 'Lumia'] values=[10,30,45,15] colors=['yellow','green','red', 'blue'] explode = [0.3,0,0,0] plt.title('A Pie Chart') plt.pie(values,labels=labels,colors=colors,explode=explode,startangle=180) plt.axis('equal') plt.show()
用autopct关键字参数,在每一块的中间位置添加文本标签来显示百分比。
能够用 shadow关键字参数添加阴影效果,将其置为True便可
plt.pie(values,labels=labels,colors=colors,explode=explode,startangle=180,shadow=True,autopct='%1.1f%%')
data = { 'series1':[1,3,4,3,5], 'series2':[2,4,5,2,4], 'series3':[3,2,3,1,3]} df = pd.DataFrame(data) df['series1'].plot(kind='pie',figsize=(6,6)) plt.show()
等值线图或等高线图在科学界很经常使用。这种可视化方法用由一圈圈封闭的曲线组成的等值线图表示三维结构的表面,其中封闭的曲线表示的是一个个处于同一层级或z值相同的数据点。虽然等值线图看上去结构很复杂,其实用 matplotlib实现起来并不难。首先,你须要用z=f(xy)函数生成三维结构。而后,定义x、y的取值范围,肯定要显示的区域。以后使用(xy)函数计算每一对(xy)所对应的z值,获得一个z值矩阵。最后,用 Contour()函数生成三维结构表面的等值线图。
定义颜色表,为等值线图添加不一样颜色,效果每每会更好;也就是说,用渐变色填充由等值线划分红的区域。
dx = 0.01 dy = 0.01 x = np.arange(-2.0,2.0,dx) y = np.arange(-2.0,2.0,dy) X,Y = np.meshgrid(x,y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) C = plt.contour(X,Y,f(X,Y),8,color='black') plt.contourf(X,Y,f(X,Y),8) plt.clabel(C,inline=1,fontsize=10) plt.show()
cmap关键字参数决定了颜色的种类
colorbar()函数增长图例做为对图表中所用颜色的说明
dx = 0.01 dy = 0.01 x = np.arange(-2.0,2.0,dx) y = np.arange(-2.0,2.0,dy) X,Y = np.meshgrid(x,y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) C = plt.contour(X,Y,f(X,Y),8,color='black') plt.contourf(X,Y,f(X,Y),8,cmap=plt.cm.hot) plt.clabel(C,inline=1,fontsize=10) plt.colorbar() plt.show()
这种图表由一系列呈放射状延伸的区域组成,其中每块区域占据必定的角度。所以若要用极区图表示两个不一样的数值,分别指定它们在极区图中所占的份量:每块区域的半径r和它所占的角度,其实这就是极坐标(r,θ),是在坐标轴系中表示数据的另外一种方法。
自定义任意的颜色列表,方法是指定颜色列表,其中每一个元素为字符
串类型的RGB编码,其格式为#rrggbb
N = 8 theta = np.arange(0.,2*np.pi,2*np.pi/N) radii = np.array([4,7,5,3,1,5,6,7]) plt.axes([0.025,0.025,0.95,0.95],polar=True) colors = np.array(['#4bb2c5',"#c5b47f","#EAAA28","#579575",'#839557',"#958c12", '#953579',"#4b5de4"]) bars = plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors) plt.show()
colors =np.array(['lightgreen', 'darkred','navy','brown','violet','plum', 'yellow','darkgreen'])
plot3d仍然使用 Figure对象,只不过Axes对象要替换为该工具集的Axes3D对象。所以,使用Axes30对象前,需先将其导入进来。
from mpl_toolkits.mplot3d import Axes3D
plot_surface()函数绘制曲面。
fig = plt.figure() ax = Axes3D(fig) X = np.arange(-2,2,0.1) Y = np.arange(-2,2,0.1) X,Y = np.meshgrid(X,Y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1) plt.show()
fig = plt.figure() ax = Axes3D(fig) X = np.arange(-2,2,0.1) Y = np.arange(-2,2,0.1) X,Y = np.meshgrid(X,Y) def f(x,y): return (1-y**5+x**5)*np.exp(-x**2-y**2) ax.plot_surface(X,Y,f(X,Y),rstride=1,cstride=1,cmap=plt.cm.hot) ax.view_init(elev=30,azim=125) plt.show()
经过这种可视化方法,可以识别数据点的分布是否遵循某种特定趋势,尤为是能够识别它们是否有汇集成簇的趋势。
下面这个例子中,咱们仍旧使用 scatter()函数,使用方法跟绘制2D图形相同,可是要将其应用于AXes3D对象。这样作,你能够屡次调用scatter()函数,在同一个3D对象中显示不一样的序列。
xs = np.random.randint(30, 40,100) ys = np.random.randint (20, 30, 100) zs =np.random.randint(10,20,100) xs2 =np. random.randint (50, 60, 100) ys2 =np. random.randint(30,40,100) zs2 = np. random.randint(50,70, 100) xs3 =np.random.randint(10, 30, 100) ys3 =np. random.randint(40, 50, 100) zs3 =np. random.randint(40, 50, 100) fig = plt.figure() ax = Axes3D(fig) ax.scatter(xs,ys,zs) ax.scatter(xs2,ys2,zs2,c='r',marker='^') ax.scatter(xs3,ys3,zs3,c='g',marker='*') ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show()
x = np.arange(8) y = np.random.randint(0,10,8) y2 = y + np.random.randint(0,10,8) y3 = y2 + np.random.randint(0,10,8) y4 = y3 + np.random.randint(0,10,8) y5 = y4 + np.random.randint(0,10,8) clr = ['#4bb2c5',"#c5b47f","#EAAA28", "#579575",'#839557',"#958c12", '#953579',"#4b5de4"] fig = plt.figure() ax = Axes3D(fig) ax.bar(x,y,0,zdir='y',color=clr) ax.bar(x,y2,10,zdir='y',color=clr) ax.bar(x,y3,20,zdir='y',color=clr) ax.bar(x,y4,30,zdir='y',color=clr) ax.bar(x,y5,40,zdir='y',color=clr) ax.set_xlabel('X Axis') ax.set_ylabel('Y Axis') ax.set_zlabel('Z Axis') ax.view_init(elev=40) plt.show()
fig = plt.figure() ax = fig.add_axes([0.1,0.1,0.8,0.8]) inner_ax = fig.add_axes([0.6,0.6,0.25,0.25]) x1 = np.arange(10) y1 = np.array([1,2,7,1,5,2,4,2,3,1]) x2 = np.arange(10) y2 = np.array([1,3,4,5,4,5,2,6,4,3]) ax.plot(x1,y1) inner_ax.plot(x2,y2) plt.show()
数,方法也很简单。 matplotlib的 Gridspec()函数可用来管理更为复杂的状况。它把绘图区域分红多个子区域,你能够把一个或多个子区域分配给每一幅子图。
gs = plt.GridSpec(3,3) fig = plt.figure(figsize=(6,6)) fig.add_subplot(gs[1,:2]) fig.add_subplot(gs[0,:2]) fig.add_subplot(gs[2,0]) fig.add_subplot(gs[:2,2]) fig.add_subplot(gs[2,1:]) plt.show()
gs = plt.GridSpec(3,3) fig = plt.figure(figsize=(6,6)) x1 = np.array([1,3,2,5]) y1 = np.array([4,3,7,2]) x2 = np.arange(5) y2 = np.array([3,2,4,6,4]) s1 = fig.add_subplot(gs[1,:2]) s1.plot(x1,y1,'r') s2 = fig.add_subplot(gs[0,:2]) s2.bar(x2,y2) s3 = fig.add_subplot(gs[2,0]) s3.barh(x2,y2,color='g') s4 = fig.add_subplot(gs[:2,2]) s4.plot(x2,y2,'k') s5 = fig.add_subplot(gs[2,1:]) s5.plot(x1,y1,'b',x2,y2,'yo') plt.show()