Matplotlib学习笔记

matplotlib是一种可视化的包,可以将我们处理加工过的数据经过一系列的排列,然后直观的显示出数据的变化,或者是能更方便看出数据的差别,走向,根据这点,可以做出数据预测等等。

1.导入matplotlib

为了方便之后的数据处理,这里将numpy包也导入

1.1 中文数据处理,画布数据处理

为了方便之后的数据处理,简化设置,以及输入中文数据,在使用matplotlib包的时候我都会先运行这四行的数据:

plt.rcParams['figure.dpi']=100
plt.rcParams['figure.figsize']=(5,3)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

1.2画布figure

plt.figure('xxxxx',facecolor='xxxxx')

在绘图的时候我们先要准备一张画布,画布里一般处理的数据就是两个。第一个用引号标识的就是画布名字,而后面facecolor就是画布的背景色

1.3plot方法

画图前要先确认变量xy

 然后在plot方法中我们可以通过这两个变量来绘制图

 

 除此之外,linewidth是设定线条粗细的,linestyle就是线条的样式,例如这种虚线可以用’--‘,’:’来表示,还有color可以设置线条颜色,简写m就是紫罗兰英文的首字母,还可以用g,r,k这种

 1.4坐标轴标签以及标题设置

title方法里可以设置这张图的标题后面的fontsize就是设置字体的大小,同理ylabel,xlabel也是可以设置xy坐标的名称以及字体大小

1.5坐标轴刻度,以及加单位方法

这里介绍的是xticks以及yticks方法的用法,xticks(区间长度,label(输出的变量格式样式等等),color可以随便改动,图片里x轴还有个rotation方法,在面对这种x轴的刻度名字特别长的时候可以避免重叠在一起。

特别要讲的是,这里xticks和yticks方法思想一样,但使用方法不一样,x轴的刻度我这里定义了个列表装了许多排不了序的字符串,因此在区间设置的时候,每个刻度之间的距离就可以设置为range(0,len(xxx),1)来控制距离,而label中只要选用我列表中设置的就可以,而y轴全是设定的数字,因此这里前面区间可以直接设置所知晓的大概最大最小值,控制距离可以通过第三个数字来定义,譬如这里就是500。

1.6legend方法

跟1.5图片中一样,当运行legend方法后,你会看到之前为曲线设置的label名字有个小框

 

不设定loc的时候它会自动找个地方不和曲线重叠,但自己设定的时候只能设定上下左右的位置,但是可能与曲线重合,就像图中显示的一样

1.7text方法

图中的坐标点上都表示了数据,这就用到了text方法text(x,y,x)就是输出x,(x,y,y)就是输出y。

如果想加单位就用%s来加单位

2.gca()坐标轴方法

2.1移动坐标轴

 当我们不想要某个坐标轴的时候我们可以直接设置颜色为空,先设定某个坐标轴ax【’top‘】就是上方的轴,set_color可以设置颜色

而set_position可以设置坐标轴位置,例如我想直观的看这个二次函数的对称性,我就可以把左边的轴以及下方的轴移到刻度为0的位置我这里左边那个轴设定-0.1就是为了防止两个0可能会重叠看不清,可以按照需求设置,或者直接设置0刻度消失

2.2刻度定位器

ax.xaxis.set_major_locator(plt.MultipleLocator(1))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

前者是设定主刻度定位器,就是我们平时所看到的刻度-1,0,1这样的,我们可以通过这个MultipltLocator来设置它的刻度区间为1或者其他,

后者是副刻度定位器就是设置这些主刻度定位器中间这些不显示刻度的小刻度的区间

当我们学会后面的subplot分成几个画布后,我们可以通过循环语句看看这四种常用的刻度定位器的用处

这里我们主定位刻度器用的分别是这四种刻度器,第一种就是不显示刻度,第二种就是最大限制显示刻度,nbins表示要显示几个刻度,第三种就是只显示列表中的刻度,最后一种就是刚刚那种方法。

2.3网格线设置

grid方法在绘图的时候可以更直观的比较数值的差距

另外这里用了semilogy方法可以将纵坐标显示为10的不同次方,当数值差距很大的时候可以简化数据的波动性

3.subplot方法

3.1简单分图

subplot方法中第一个数值,譬如221就是二行二列第一张图的意思,图中这种就是二行一列第一张因此分成上下两张图

3.2用fig,axes来分图

这里用的方法就是将subplot画图的方法交给了axes,然后axes【0】【1】就是第一行第二列

另外这里的plt.tight_layout将图片之间的距离可以很好的隔离开,防止数值重叠,是个很好用的方法

3.3进阶版本

这里通过遍历能画出九宫格,也可以调整数据,画出其他的

import matplotlib.gridspec as mg
plt.figure('Grid Layout',facecolor='lightgray')
gs=mg.GridSpec(3,3)
plt.subplot(gs[0,:2])
plt.text(0.5,0.5,1,ha='center',va='center',
            size=36,alpha=0.6)
plt.xticks([])
plt.yticks([])
plt.subplot(gs[0:2,2])
plt.text(0.5,0.5,2,ha='center',va='center',
            size=36,alpha=0.6)
plt.xticks([])
plt.yticks([])
plt.subplot(gs[1:2,1:2])
plt.text(0.5,0.5,3,ha='center',va='center',
            size=36,alpha=0.6)
plt.xticks([])
plt.yticks([])
plt.subplot(gs[1:3,0])
plt.text(0.5,0.5,4,ha='center',va='center',
            size=36,alpha=0.6)
plt.xticks([])
plt.yticks([])
plt.subplot(gs[2,1:3])
plt.text(0.5,0.5,5,ha='center',va='center',
            size=36,alpha=0.6)
plt.xticks([])
plt.yticks([])
plt.show()

这里导入了matplotlib.gridspec,将画布分成更小的网格,这样就可以画出更多不规则矩形的搭配,plt.subplot(gs[0:2,2])这里的grid已经设定为3*3,因此这个表示就是第一第二行的第三列。

4.绘制图像

4.1柱状图

柱状图可以分成纵向以及横向的图,这里先讲纵向的,横向的可以在此基础上拓展

 这里柱状图的底部有些不在坐标轴上就是因为设置了bottom数值,可以设置图像距离x轴

plt.bar(x,y,color)是一般柱状图的格式

刚刚所说的bottom方法其实一般是在奖牌之类的图像中使用的

 可以通过设置bottom的位置来叠加奖牌数,方便计量奖牌总数差别

当然若是要比较各项奖牌的个数差别,叠加显然不能直观表示。

这里就需要讲究width的用法了,width在其他时刻是个随便设置数量的宽度单位,但这里需要各国的奖牌能够并排紧密排列,因此要设定银牌加上金牌的宽度,往右边挪一个宽度,铜牌也是如此

这里text的用法中多了va和ha,分别是设置竖直方向位置以及横向位置

ha有三个选择:right,center,left

va有四个选择:'top', 'bottom', 'center', 'baseline'

要注意的是除了center之外,其他的表示都是相反的,top说明图像在字体的top位置如此这般。

 

 之后我们写横向的柱状图就方便许多,不过这里不用width,而是改用height,差别不是很大

 叠在在一起的柱状图也不是用bottom,而是替代为left这个设置,其他没有太大的差别,只是要注意谁叠加在谁上面

4.2直方图

直方图与柱状图区别不是很大,但是直方图是紧密排列的,可以能表示正态分布等等

直方图运用的是hist方法,同样前面是xy,由于是紧密排列,我们一般会把边缘颜色edgecolor设置为白色,方便区分。

 我们也可以讲折线图与直方图结合在一起,直观的表示其变化

通过直接设置binx轴,直方图的间距可以自行调整,来显示占比大小等等

 对于多类型直方图

有点类似于前面的柱状图, 就是来显示不同类型直方图结合在一起

4.3饼图

饼图在我看来是最直观的观察数据占比的图像,这里x,labels就是前面xy一样的作用,explode分别对应不同的labels,可以以不同的状态膨胀,远离圆心,数值越大,离圆心越远。

所以数值不能太大

否则会形成这种情况

4.4散点图

散点图其实就是讲plot方法形成的曲线变成许多点,但是这不是它主要的用法

 

这样设置能直观的看出哪一个区间点最多,说明这块地方普遍性更大

散点图中x,y还是没变,图中增加了点颜色设置。c是color的缩写,d是身高体重的方差,用来表示颜色可以更直观的通过颜色看出不同方差的人的点的分布,cmap可以上网搜不同的颜色分布,jet是比较普遍使用的颜色光谱

同样散点图可以搭配其他的图像使用

plt.figure('啦啦啦',
          figsize=(4,3),
          dpi=120,
          facecolor='m')
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
c,s=np.cos(x),np.sin(x)
plt.grid(True,linestyle="--",color='grey',linewidth='0.5',axis='both')
plt.xlabel('x轴')
plt.ylabel('y轴')
#plt.xlim(0,np.pi)
#plt.ylim(0,1)
vals=[-np.pi,-np.pi/2,0,np.pi/2,np.pi]
texts=['-Π','-Π/2','0','Π/2','Π']
plt.xticks(vals,texts)
plt.plot(x,c,label='cos(x)曲线',ls=':',color='green',linewidth=2,)
plt.plot(x,s,label='sin(x)曲线',color='blue')
pointx=[np.pi/2,np.pi/2]
pointy=[1,0]
plt.scatter(pointx,pointy,marker='o',color='r',s=70,label='sample points ',zorder=3)
ax=plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',-0.1))
ax.spines['bottom'].set_position(('data',0))
plt.legend()
plt.tight_layout()
plt.annotate(r'$[\frac{\pi}{2},1]$',
             xycoords='data',
             xy=(np.pi/2,1),textcoords='offset points'
             ,xytext=(30,10)
            ,fontsize=14,arrowprops=dict(arrowstyle='-|>',connectionstyle='bar'))

 通过散点图刻意标识自己想特指的点,另外arrow方法可以不用背,用的时候复制一下就好,里面的数据就是所标识的点的表示方法,xycrood不用改就是data,xy就是要标注的点,xytext箭头的长度位置,arrowstyle是箭头的样式,可以是代码中的,也可以是——》这样,connectionstyle就是箭头和线的链接,这里是bar就是直线,你也可以设置为弯曲的线

5.numpy ,matplotlib结合分析

通常数据分析都是对股票分析,分析走向等等

这里我们先用numpy导入一个身高体重的数据

height,weight=np.loadtxt('women.csv'
          ,delimiter=','
          ,usecols=(1,2),
          unpack=True,
          dtype='f8,f8'
          )
plt.figure('身高体重',facecolor='lightgray')
plt.title('身高体重',fontsize=18)
plt.xlabel('身高',fontsize=14)
plt.ylabel('体重',fontsize=14)
mean=np.mean(weight)
plt.hlines(mean,height[0],height[-1],
          ls='-',color='m'
          ,label='Mean')

plt.plot(height,weight,color='r',ls='--',lw=2)
plt.legend()
plt.xticks(range(150,185,5),['%scm' %i for i in range(150,185,5)],color='red')
plt.yticks(range(55,76,5),['%skg' %i for i in range(55,76,5)],color='red')
plt.show()

这里运用了numpy的mean方法画出了均线,但是显然这种递增的曲线不需要这种均线,还是股票分析的曲折曲线需要均线,方差这些数据

因为没有股票的数据,因此我在这里就是用random创造了一些数据

date=np.linspace(1,31,30)
np.random.seed(1)
h=np.random.randint(1,100,size=30)
plt.figure('random stock',facecolor='lightgray')
plt.title('random stock',fontsize=18)
plt.xlabel('日期',fontsize=14)
plt.ylabel('股值',fontsize=14)
plt.grid()
plt.gca().xaxis.set_major_formatter(ticker.FormatStrFormatter('%.fcm'))
plt.gca().yaxis.set_major_formatter(ticker.FormatStrFormatter('%.fkg'))
mean=np.mean(h)
plt.hlines(mean,date[0],date[-1],
          ls='-',color='m'
          ,label='Mean')
plt.plot(date,h,
        label='股票走势'
        ,color='r'
        ,ls='--',alpha=0.2)
ma5=np.zeros(h.size-4)
for i in range(ma5.size):
    ma5[i]=h[i:i+5].mean()
plt.plot(date[4:],ma5,color='g',
        ls=':'
        ,label='五日均值')
ma10=np.zeros(h.size-9)
for i in range(ma10.size):
    ma10[i]=h[i:i+10].mean()
plt.plot(date[9:],ma10,color='y',
        ls=':'
        ,label='十日均值')
plt.legend()
plt.show()

hlines方法绘制均线,特别的运用ma5,ma10来创造了5天以及10天的均值曲线,这样更能方便分析股市走向,当10日和5日曲线交叉的时候说明跌势已成等等,可以分析很多数据

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值