Matplotlib随记1

Posted 根叔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matplotlib随记1相关的知识,希望对你有一定的参考价值。

Matplotlib概况

       在我们进行机器学习分析的时候,通常需要将我们所需要的结果进行图像化表示出来,以方便我们可以更加形象的看到数据变化大趋势。在我进行寻找相应的工具时,我发现了Matplotlib是一个相当好的工具,主要是因为Matplotlib有很强大的功能,它可以为我们汇出各种美丽的图形,比如线图,散点图,等高线图,条形图,柱状图,3D图形,甚至是动画图像等等,我们可以根据自己的需求绘出自己所需要的图形。比如说,以下几个图形就是我们通过Matplotlib进行绘制的

     

Matplotlib安装

俗话说,“工欲善其事必先利其器”,在学习matplotlib之前,必先安装好matplotlib相关环境,我用的是ubuntu16.04系统,安装相对比较简单。打开控制台窗口,在窗口中输入:

#python 3+ 请使用以下代码
$ sudo apt-get install python3-matplotlib
#python 2+ 请使用以下代码
$ sudo apt-get install  python-matplotlib

在安装好matplotlib之后,我们就可以尽兴的翱翔在matplotlib的海洋里面了

matplotlib基本用法

首先我们要使用import 导入matplotlib,在使用matplotlib时,我们通常不需要导入matplotlib整个模块,而是只需导入matplotlib中的pyplot这一个模块即可,并简写成plt;使用import 导入模块numpy,并简写成np

import matplotlib.pyplot as plt
import numpy as np

使用np.linspace定义x:范围是(-1,1);个数是50,仿真一位数据组(x,y)表示曲线1

x=np.linspace(-1,1,50)
y=2*x + 1

使用plt.figure定义一个图像窗口,使用plt.plot画(x,y)曲线。使用plt.show显示图像

plt.figure()
plt.plot(x,y)
plt.show()

完整代码如下:

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()

绘成的图像如下:

 

 

figure线条

在上面的基础上,使用plt.figure()定义一个图像窗口:编号为3;大小为(8,5)。使用plt.plot画(x,y2)曲线。使用plt.plot画(x,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线。使用plt.show显示图像

plt.figure(num=3,figsize=(8,5),)
plt.plot(x,y2)
plt.plot(x,y1,color=\'red\',linewidth=1.0,linestyle=\'--\')

完成代码为:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y1=2*x +1
y2=x**2

plt.figure()
plt.plot(x,y1)

plt.figure(num=3,figsize=(8,5),)
plt.plot(x,y2)
plt.plot(x,y1,color=\'red\',linewidth=1.0,linestyle=\'--\')
plt.show()

其产生的图像为:

设置坐标轴

下面主要是介绍如何在matplotlib中如何设置坐标轴的范围,单位长度,替代文字等等

使用plt.figure定义一个图像窗口,使用plt.plot画(x,y2)曲线。使用plt.plot画(x,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线

plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color=\'red\',linewidth=1.0,linestyle=\'--\')

使用plt.xlim设置x坐标轴范围:(-1,2);使用plt.ylim设置y坐标轴范围:(-2,3);使用plt.xlable设置x坐标轴名称:‘I am X\';使用plt.ylabel设置y坐标轴名称:‘I am y\';

plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel(\'I am x\')
plt.ylabel(\'I am y\')

使用np.linspace定义范围及个数:范围是(-1,2);个数是5.使用print函数打印出新定义的范围。使用plt.xticks设置x轴刻度:范围是(-1,2);个数是5

new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)

使用plt.yticks设置y轴刻度以及名称:刻度为[-2,-1.8,-1,1.22,3];对应刻度的名称为[\'really bad\',\'bad\',\'normal\',\'good\',\'really good\'].使用plt,show显示图像。

plt.yticks([-2,-1.8,-1,1.22,3],[r\'$really\\ bad$\',r\'$bad$\',r\'$normal$\',r\'$good$\',r\'$eally\\ good$\'])

使用plt.gca获取当前坐标轴的信息。使用.spines设置边框:右侧边框;使用.set_color设置边框颜色:默认白色;使用.spines设置边框:上边框;使用.set_color设置边框颜色:默认白色;

ax=plt.gca()
ax.spines[\'right\'].set_color(\'none\')
ax.spines[\'top\'].set_color(\'none\')

下一步我们调整坐标轴。使用.xaxis.set_ticks_position设置x坐标刻度数字或名称的位置:bottom(所有位置:top,bottom,both,default,none)

ax.xaxis.set_ticks_position(\'bottom\')

使用.spines设置边框:x轴;使用.set_position设置边框位置:y=0的位置;(位置所有属性:outward,axes,data)

ax.spines[\'bottom\'].set_position((\'data\',0))

使用.yaxis.set_ticks_position设置y坐标刻度数字或者名称的位置:left(所有位置:left,right,both,default,none)

ax.yaxis.set_ticks_position(\'left\')

使用.spines设置边框:y轴;使用.set_position设置边框位置:x=0的位置;(位置所有属性:outward,axes,data)  使用plt.show显示图像

ax.spines[\'left\'].set_position((\'data\',0))
plt.show()

全部代码如下:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y1=2*x + 1
y2=x**2

plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color=\'red\',linewidth=1.0,linestyle=\'--\')

plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel(\'I am x\')
plt.ylabel(\'I am y\')

new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)

plt.yticks([-2,-1.8,-1,1.22,3],[r\'$really\\ bad$\',r\'$bad$\',r\'$normal$\',r\'$good$\',r\'$eally\\ good$\'])


ax=plt.gca()
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))


plt.show()

结果如下:

legend 图例

在matplotlib中,我们通常使用其中的legend图例来帮助我们展示每个数据对应的图像名称,从而更好的让读者认识你的数据结构

在这里,我们对图中的两条线进行绘制,首先我们设置两条线的类型信息(蓝色实线和红色虚线)

l1,=plt.plot(x,y2,label=\'linear line\')
l2,=plt.plot(x,y1,color=\'red\',lineWidth=1.0,linestyle=\'--\',label=\'square line\')

legend将要显示的信息来自于上面代码中的label,所以我们只需要简单写一下代码,plt就能自动的为我们添加图例

plt.legend(loc=\'upper right\')

其中,参数 loc=\'upper right\' 表示图例将添加在图中的右上角

但是,有时候我们想调整图例的位置和名称,比如如果我们想单独修改之前的label信息,给不同类型的线条设置图例信息,我们可以在plt.legend中输入更多的参数。如果以以下这种形式添加legend,我们需要确保,在上面的代码plt.plot(x,y2,label=\'linear line\')和plt.plot(\'x,y1,label=\'\'square line\')中有用变量l1,l2分别存储起来。而且我们需要注意的是l1,l2要以逗号结尾,因为我们需要确保plt.plot()返回的是一个列表。

plt.legend(handles=[l1,l2],labels=[\'up\',\'down\'],loc=\'best\')

这样我们就能分别重新设置线条对应的label了

其中,\'loc\'参数有很多,‘best\'表示自动分配最佳位置,其余的如下:

‘best’:0,
\'upper right\' : 1,
\'upper left\' : 2,
\'lower left\' : 3,
\'lower right\' : 4,
\'right\' : 5,
\'center left\' : 6,
\'center right\' : 7,
\'lower center\' : 8,
\'upper center\' : 9,
\'center\' : 10,

这部分的完整代码如下:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y1=2*x + 1
y2=x**2

plt.figure()

plt.xlim((-1,2))
plt.ylim((-2,3))

new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)

plt.yticks([-2,-1.8,-1,1.22,3],[r\'$really\\ bad$\',r\'$bad$\',r\'$normal$\',r\'$good$\',r\'$eally\\ good$\'])

l1,=plt.plot(x,y2,label=\'linear line\')
l2,=plt.plot(x,y1,color=\'red\',lineWidth=1.0,linestyle=\'--\',label=\'square line\')
#plt.legend(loc=\'upper right\')
plt.legend(handles=[l1,l2],labels=[\'up\',\'down\'],loc=\'best\')
plt.show()

所产生的图像如下:

Annotation标注

在我们画图形需要对某些特殊地方进行标注时,我们可以使用annotation.matplotlib中的annotation中的两种方法,一种是plt里面的annotate,另外一种直接用plt里面的text来写标注

首先,我们绘制一条直线

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=2*x + 1

plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y,)

之后,我们再移动坐标轴的位置

ax=plt.gca()
ax.spines[\'right\'].set_color(\'none\')
ax.spines[\'top\'].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))

之后,我们再标注出(x0,y0)的位置信息,用plt.plot([x0,x0,],[0,y0,],\'k--\',linewidth=2.5)画出一条垂直于x轴的虚线

x0=1
y0=2*x0 + 1;
plt.plot([x0,x0,],[0,y0,],\'k--\',linewidth=2.5)
plt.scatter([x0, ],[y0, ],s=50,color=\'b\')

再之后,我们对图像添加一些注释,比如我们可以对(x0,y0)这个点添加注释

plt.annotate(r\'$2x+1=%s$\' % y0 , xy = (x0,y0) , xycoords=\'data\' , xytext=(+30,-30) ,
    textcoords=\'offset points\' , fontsize=16 ,
    arrowprops=dict(arrowstyle=\'->\',connectionstyle="arc3,rad=.2"))

我们也可以对文本中添加一些需要的注释

plt.text(-3.7,3,r\'$This\\ is\\ the\\ some\\ text. \\mu\\ \\sigma_i\\ \\alpha_t$\',
    fontdict={\'size\':16,\'color\':\'r\'})

其中,-3.7和3是选取在文本中添加注释的位置,空格需要用到转字符\\,fontdict设置字体。

其中,本部分的全部源码是:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=2*x + 1

plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y,)

ax=plt.gca()
ax.spines[\'right\'].set_color(\'none\')
ax.spines[\'top\'].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))


x0=1
y0=2*x0 + 1;
plt.plot([x0,x0,],[0,y0,],\'k--\',linewidth=2.5)
plt.scatter([x0, ],[y0, ],s=50,color=\'b\')

plt.annotate(r\'$2x+1=%s$\' % y0 , xy = (x0,y0) , xycoords=\'data\' , xytext=(+30,-30) ,
    textcoords=\'offset points\' , fontsize=16 ,
    arrowprops=dict(arrowstyle=\'->\',connectionstyle="arc3,rad=.2"))

plt.text(-3.7,3,r\'$This\\ is\\ the\\ some\\ text. \\mu\\ \\sigma_i\\ \\alpha_t$\',
    fontdict={\'size\':16,\'color\':\'r\'})

plt.show()

所产生的图片是:

tick能见度

当我们生成图片太多的时候,往往会出现图片的内容较多,相互掩盖的情况。我们可以通过设置相关内容的透明度来使图片更加容易观察,也即是通过本节中的bbox参数设置来调节图像信息。

参考之前的例子,我们可以绘制出图片的基本信息:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=0.1*x

plt.figure()
plt.plot(x,y,linewidth=10)
plt.ylim(-2,2)

ax=plt.gca()
ax.spines[\'right\'].set_color(\'none\')
ax.spines[\'top\'].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))

然后我们对遮挡的图像调节相关透明度,在本例中设置x轴和y轴的刻度数字来进行透明度设置

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor=\'white\',edgecolor=\'None\',alpha=0.7))

 

其中,label.set_fontsize(12)用来重新调整字体大小,set_bbox设置目的内容中关于透明度参数,facecolor调节box前景色,edgecolor设置边框,在本处我们将边框设置成无,alpha用来设置透明度。

在这一阶段,其全部源码为:

 

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=0.1*x

plt.figure()
plt.plot(x,y,linewidth=10)
plt.ylim(-2,2)

ax=plt.gca()
ax.spines[\'right\'].set_color(\'none\')
ax.spines[\'top\'].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))


for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor=\'white\',edgecolor=\'None\',alpha=0.7))

plt.show()

 

所绘出来的图片为:

 

以上是关于Matplotlib随记1的主要内容,如果未能解决你的问题,请参考以下文章

大数据随记 —— 利用Python分析快手APP全国大学生用户数据(2022 年初赛第四题 )

ArcMap操作随记

ArcMap操作随记

python 随记

20200218随记

实时matplotlib图在循环中不起作用[重复]