【Matplotlib】利用Python进行绘图

更新时间:2023-07-14 02:52:04 阅读: 评论:0

【Matplotlib】利⽤Python进⾏绘图
【Matplotlib】
  教程:morvanzhou.github.io/tutorials/data-manipulation/plt/
  官⽅⽂档:matplotlib/api/pyplot_summary.html
  这个模块是⼀个Python上⽤于进⾏绘图的模块。做科研的⼈经常会使⽤的matlab就是这个模块的⼀个竞品。就我个⼈⽽⾔,matplotlib 感觉更像是⼀个echarts.js之类前端库的⼀个后端版本。和echarts⼀样,它可以⽀持通过python画出散点图,条状图,饼状图甚⾄是3D图和动画。
  由于靠这个画图的话⼀般都会遇到⽐较复杂的数据处理,所以numpy也经常和matplotlib⼀起出现⼀起使⽤。
  ■  基本安装和使⽤
  在linux上安装可以通过包管理⼯具⽐如yum(我的虚拟机⾥⾯已经安装了matplotlib,但是已经忘了当时是⽤pip还是yum装的了…)
  windows的话⽬测⽤pip也可以⼀步搞定。如果不⾏可以参考上⾯给出的参考⽂档连接。
  下⾯是⼀个matplotlib的helloworld
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y = 2*x + 1
plt.figure()
plt.plot(x,y)
plt.show()
  如果是在windows下的某个脚本中运⾏这段程序,那么完了之后会跳出⼀个窗⼝,显⽰⼀幅图⽚如图所⽰:
  可以看到这个显⽰的图的组件本⾝还有⼀些功能⽐如跟随⿏标显⽰坐标值,放⼤局部图像等。
  然后我们来看看这段代码。⾸先x是numpy中的⼀个array对象,其内容是-1到1之间均等地取了⼤约50个值。这些值其实就是我们图中后来的横坐标。然后通过array加减乘除时特别的性质,可以将类似于函数表达式那样的式⼦写在代码⾥。即2*x + 1,很接近函数表达式的y=2x+1了。那么y也是⼀个array,⼀⼀对应x中各个值进⾏2*x+1后的值。这样的⼀个array,x和array y,两个坐标集组成了⼀幅图。那么如何将这幅图显⽰出来,⽤到的就是后三⾏代码。
  这⾥需要注意的是,绘制这个图的过程其实是⽤直线将各个点之间连接起来的操作。由于这个图最终本⾝就是⼀个直线,所以看起来似乎最初x的样本量取50个点和两个点结果都⼀样。但是如果表达式换成x**2 + 1那么取点多少就会影响到这个⼆次函数图是否光滑了。下⾯是分别取10个点和50个点时⼆次函数的图。
(10个点)(50个点)
  ■  图像(plot)的控制
  ●线条的控制
  上⾯代码中的plt.figure()⽅法声明的其实是⼀个figure窗⼝,即windows中弹出来的这个窗⼝。这个窗⼝中可以包含很多个图。上⾯只是添加了⼀个图。实际上还可以尝试添加更多。
  ⼀个图的概念其实在这⾥叫plot,正如你所见,plot⽅法⽤于向⼀个figure窗⼝中添加⼀个图。
x = np.linspace(-10,10,50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
  因为出现了两个图,matplotlib⾃动为两个图设置了不同的颜⾊以⽰区分。如果想要⾃定义颜⾊,线条样式等等属性的话,可以将这些参数写在plot⽅法中⽐如:
  plot(x,y,linestyle='dashed',linewidth=0.5,color='#3479f7')  其余更多参数以及参数如何取值可以参考
matplotlib/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot
  ●坐标轴控制
  上⾯的所有图中,坐标轴都是根据我们给出的数据范围⾃动⽣成的。如果想要⼿动指定坐标轴的范围呢
  使⽤plt.xlim/ylim两个⽅法可以分别设置x轴和y轴的范围。⽤法就是xlim(min,max)。使⽤plt.xlabel和ylabel可以设置x/y轴的说明⽂字。使⽤icks/yticks两个⽅法可以分别设置X和Y轴的坐标点的值是多少。参数的话是numpy.linspace的返回值。
  ⽐如沿⽤上⾯⽤到的y1和y2,进⾏这样的代码画图:
plt.figure()
plt.plot(x,y1)
plt.plot(x,y2,linestyle='dashed',linewidth=0.5,color='red',marker='.',)
plt.xlim(1,3)
plt.xlabel('value of X')
plt.show()
  需要额外注意的⼀点是,加⼊xlim和xticks互相冲突了,那么最终显⽰的图是以后设置者为准。⽐如这⾥xticks再xlim后⾯设置,那么最终画出的图以xticks中定的范围为准。
  除了简单的数值设置外,xticks/yticks还⽀持label设置。⽐如xticks([1,2,3,4],['bad','ok','good','verygood'])这样的⽅式,来将数值坐标值和⽂字描述的坐标值⼀⼀对应起来。
  a()  这个⽅法返回⼀个包含所有坐标轴的对象。gca的全称估计是get current axes,也就是获取到当前所有坐标轴。
刺客五六千
  其中⽐较重要的⼀条属性是spines,这个属性是⼀个字典,可以有left,right,top,bottom的取值分别对应⼀个图的四条边。⽐如令ax = a(),然后
  ax.spines['top'].t_color('none') 以及 ax['right'].t_color('none')  这样⼦的话那么就可以让显⽰出来的图没有上边框和右边框。
  除了t_color,还可以t_position。⽐如ax.spines['bottom'].t_position(('data',0)),⾸先bottom指的是X轴的那个边,把它
t_position到data是0,即Y轴的值为0的⾼度。类似的将left也设置⼀下。然后将top和right设置不可见之后,这样就得到⼀个经典的坐标系的图了。
  上⾯说的是a().spines这个属性。其实gca返回的对象中还有⼀些属性⽐如xaxis/yaxis这两个就是坐标轴的对象(spines的本意是脊柱、⼲,所以指的更多是构成坐标轴的那条线。⽽xaxis这种很明显就是指坐标轴本⾝,指的更多是坐标轴的数字、⽂字标签的部分。)
  同样的,令 ax = a() 的话,ax.xaxis就是X轴对象,可以有下列⽅法:
  ax.xaxis.t_ticks_position('top')  可以设置X轴的数字和坐标点出现在图的哪条边上。如果是top就是出现在上边。如果配合spines['top'].t_color('none')的话,那么就可以得到只有数据标点(且在图上⽅位置),没有轴线的图了。
  ●图例
  在上⾯画两条线的⽅法plot中,还可以添加⼀个参数label,⽤来通过⽂字说明这条线的内容。有了这个label之后就可以将其关联到图例上。这样图例就可以显⽰说明。
  关联图例的⽅法是plt.legend,不过需要注意的是legend⽅法⼀定要在plot完成之后调⽤,否则将⽆法呈现图例(这其实呼应了之前xlim 和xticks取值的后设置后决定,这强调了plt对于图像绘制是线性执⾏的特点)。⽐如如下代码:
plt.figure()
plt.plot(x,y1,label='straight line')
plt.plot(x,y2,linestyle='dashed',linewidth=0.5,color='red',marker='.',label='square line')
plt.legend()
plt.ylim(-1,4)
plt.xlim(-3,3)
ax = a()
ax.spines['top'].t_color('none')
ax.spines['right'].t_color('none')
ax.spines['left'].t_position(('data',0))
ax.spines['bottom'].t_position(('data',0))
plt.show()
  图例出现的位置默认是在左下⽅,可以在legend⽅法中⽤loc参数指明具体的位置。⽐如plt.legend(lo
c='upper right')是出现在右上⾓。类似的参数值还有lower right,center left等等。此外还有⼀个best,这个值是说把位置⾃动交给电脑去判断,尽量选择⼀个不挡住任何东西的好的位置。
  ●划线标点标注
张潇天
家电清洗行业  上⾯说过,plot⽅法其实是将给出的参数分别解释为X坐标和Y坐标的集合,然后⼀⼀将这些点⽤直线连接起来组成的图形。那么要在图上额外画⼀条线段就不难了。
  ⽐如plt.plot([1,1],[0,2],linestyle='dashed')这个画的线段就是(1,0)点和(1,2)点之间的连线,就是⼀条垂直于X轴的线。
  ⾄于标点,其实⽤的是⽤来做散点图的plt.scatter⽅法。由于散点图后⾯还会详细说这⾥就不多说了。这⾥只给出⼀个调⽤⽅法:
  plt.scatter([1,],[2,],s=20,color='blue')
  除了标点,另外⼀个重要的标注就是⽂字标注了。⽂字标注⼤概可以通过这样的⽅法来实现:
  plt.annotate('emphasize point',xy=(1,3),xytext=(15,-15),textcoords='offt pixels',arrowprops=dict(arrowstyle='<|-',
connection))
  emphasize point是描述⽂字。xy则是本条标注针对的图中的点。xytext配合textcoords指出的定位⽅式,指出了标注⽂字应该放在什么地⽅,如果按照上⾯的这种组合的话,就是说⽂字的左上⾓点是标注点的右下⽅各15个像素的地⽅。arrowprops参数⽐较有意思,它指出了是否需要⼀个标注⽂字和标注点之间的箭头标识。arrowstyle可以有<-,<|-,->,-|>,是不是很形象?当箭头指向左边的意思是,图上的箭头是从标注点指向标注⽂字的,向右则相反。connectionstyle是⼀个完整的字符串,不过它也有很多信息,⽐如rad指出了箭头线的弧度。
  以上是对于针对某个点的标注⽂字,如没有特定的⽬标点,只是想写点⽂字的话可以使⽤⽅法
  (-2.4, 6, 'This is some text',fontdict={'size': 16, 'color': 'r'})
  这个⽅法中(-2.4,6)这个点是⽂字左上⾓的坐标,fontdict指定⼀个指定字体格式的字典。⽐较好懂就不说了。
  总结上⾯说到的⼀些东西再给⼀个⽰例:
plt.figure()
plt.plot(x,y1,label='straight line')
plt.plot(x[:35],y2[:35],linestyle='dashed',linewidth=0.5,color='red',label='square line')
plt.plot([1,1],[0,3],'k--')
plt.scatter([1,],[3,],s=20,color='blue')
plt.annotate('emphasize point',xy=(1,3),xytext=(15,-15),textcoords='offt pixels',arrowprops=dict(arrowstyle='<|-', connection))
<(-2.4, 6, 'This is some text',fontdict={'size': 16, 'color': 'r'})
plt.legend(loc='best')
ax = a()
ax.spines['top'].t_color('none')
ax.spines['right'].t_color('none')
ax.spines['left'].t_position(('data',0))
ax.spines['bottom'].t_position(('data',0))
plt.show()
View Code
   ■  分图类型⽰例
  ●散点图
n = 1024    # data size
X = al(0, 1, n) # 每⼀个点的X值
Y = al(0, 1, n) # 每⼀个点的Y值
T = np.arctan2(Y,X) # for color value
plt.figure()
ax = a()
ax.spines['bottom'].t_position(('data',0))
ax.spines['left'].t_position(('data',0))
ax.spines['top'].t_color('none')
ax.spines['right'].t_color('none')
plt.scatter(X,Y,c=T,s=20)
plt.xlim(-0.5,0.5)
plt.show()
  al⽅法是⽣成⼀个平均值为0,⽅差为1,总数为1024的数据集。这样两个数据集分别作为X坐标和Y坐标构成了1024个点的集合。再通过调⽤arctan2将所有随机点对应的⼀个弧度求出,把这个弧度当做是⼀个颜⾊的替代值。
鱼的成语
  随后就是⽣成图形的过程,对于gca返回的处理部分是把上右边去掉,下左边移到中间形成坐标系的图。然后scatter⽅法⼀次性将所有的点画到图上。X是横坐标的array,Y是纵坐标的array,c是color指定颜⾊的值,s是每个点的size。最后为了⽅便看(由于散点图在X和Y轴上都符合正则分布,导致原点附近的点特别密集,如果scale⽐较⼤中间就是⼀⽚糊),limit⼀下X轴的坐标。
  最终看到的图形是这样的:
  ● 其他图种,都是依葫芦画瓢的事,就不多说了,可以⽹上随便搜⼀个看⼀看就⾏了。
■  多图合⼀显⽰
  上⾯的所有实例中,plt.figure()得到的窗⼝对象⾥⾯都只显⽰了⼀幅图,图种可能有多条线。
热巴电视剧  如果要多张图显⽰在同⼀个窗⼝中,那么需要⽤到plt.subplot这个⽅法。这个⽅法的调⽤⽅式通常是这样的:
  plt.subplot(2,2,1)或者plt.subplot(221)。221的意思是,如果将整个窗⼝分隔成2*2格式的话,那么现在切换plt到从左到右从上⾄下第1个⽹格内进⾏编辑。直到再次调⽤subplot切换⽹格之前,plt做的所有操作都会这个⽹格内进⾏。
  matplotlib严格按照代码中画图的顺序来画图,如果后来画的图和前⾯的图有重叠,那么前⾯的图就会被整个删除,接下来界⾯上就会只剩下后来画的图了。
  另外subplot并不要求前后调⽤的⼏次都是统⼀规格⽹格的图,⽐如下⾯这段代码显⽰出的图是这样的:
def dicars(plt):
ax = a()
ax.spines['top'].t_color('none')
ax.spines['right'].t_color('none')
ax.spines['left'].t_position(('data',0))
ax.spines['bottom'].t_position(('data',0))
plt.figure()
# 第⼀幅图澳大利亚技术移民
工作打算
plt.subplot(221)
plt.plot([1,1],[0,1])
dicars(plt)
# 第⼆幅图
plt.subplot(222)古刹
plt.plot([2,2],[0,1])
dicars(plt)
# 第三幅图
plt.subplot(212)
plt.plot([3,3],[0,1])
dicars(plt)
plt.show()

本文发布于:2023-07-14 02:52:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1095369.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:标注   坐标   位置   设置   对象   坐标轴
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图