飞道的博客

2020数学建模亚太赛画图准备(Python-Matplotlib)Matplotlib

329人阅读  评论(0)

2020数学建模亚太赛画图准备(Python-Matplotlib)Matplotlib

本文用于自己学习笔记,以及新手小白借鉴。用到的函数都有相关解释。可以说是非常全面了。Matplotlib 是Python中类似 MATLAB 的绘图工具。

1. 简介Matploblib

1.1 Figure

在任何绘图之前,需要用Figure新建一个画板,开始绘图。

import matplotlib.pyplot as plt
fig = plt.figure()

1.2 Axes

添加Axes添加坐标轴,设置坐标轴的范围。

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[0.5, 4], ylim=[1, 8], title=Example',ylabel='Y-Axis', xlabel='X-Axis')
plt.show()

下面是代码块的详细解释:

fig.add_subplot(111)就是添加Axes的,参数的解释的在画板的第1行第1列的第一个位置生成一个Axes对象来准备作画。也可以通过fig.add_subplot(2, 2, 1)的方式生成Axes,前面两个参数确定了面板的划分,例如 2, 2会将整个面板划分成 2 * 2 的方格,第三个参数取值范围是[1, 2*2]表示第几个Axes。如下面的例子

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
ax1.set(title='ax1')
ax2.set(title='ax2')
ax3.set(title='ax3')
ax4.set(title='ax4')
plt.show()

上图,可见由于间隔问题,绘制出的图片略显拥挤。通过fig.subplots_adjust()我们修改了子图水平之间的间隔wspace=0.5,垂直方向上的间距hspace=0.3,左边距left=0.125等等,这里数值都是百分比的。以[0, 1]为区间,选择left、right、bottom、top注意top 和 right是 0.9 表示上、右边距为百分之10。不确定如果调整的时候,fig.tight_layout()是一个很好的选择。之前说到了内边距,内边距是子图的,也就是Axes对象,所以这样使用ax.margins(x=0.1, y=0.1),当值传入一个值时,表示同时修改水平和垂直方向的内边距。

也可以直接使用fig.tight_layout()自动调整布局,使标题之间不重叠。

fig, axes = plt.subplots(2, 2, figsize=(9, 9))
fig.subplots_adjust(wspace=0.5, hspace=0.3,
                    left=0.125, right=0.9,
                    top=0.9,    bottom=0.1)

#fig.tight_layout() #自动调整布局,使标题之间不重叠
plt.show()

ax.set(xlim=[0.5, 4], ylim=[1, 8], title=Example’,ylabel=‘Y-Axis’, xlabel=‘X-Axis’)在一幅图上添加了一个Axes,然后设置了这个Axes的X轴以及Y轴的取值范围。
在循环绘图时用二维数组的形式访问axes ,会大大提高效率。

import matplotlib.pyplot as plt
fig = plt.figure()
fig = plt.figure()
fig, axes = plt.subplots(nrows=2, ncols=2)#2*2个图,(nrows=3, ncols=3)有9个图
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')
fig.tight_layout()
#ax = fig.add_subplot(2,2,1)
#ax.set(xlim=[0.5, 4], ylim=[1, 8], title=Example',ylabel='Y-Axis', xlabel='X-Axis')
plt.show()

2. 基本绘图

区分条形图和直方图:

  • 条形图是用条形的长度表示各类别频数的多少,其宽度(表示类别)则是固定的;
  • 直方图是用面积表示各组频数的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义。
  • 由于分组数据具有连续性,直方图的各矩形通常是连续排列,而条形图则是分开排列。
  • 条形图主要用于展示分类数据,而直方图则主要用于展示数据型数据

2.1 线

plot()函数画出一系列的点,并且用线将它们连接起来。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, np.pi * 6)
y_sin = np.sin(x)
y_cos = np.cos(x)

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
ax1.set(title='one')
ax2.set(title='two')
ax3.set(title='three')
ax4.set(title='four')
fig.tight_layout()
ax1.plot(x, y_sin)
ax2.plot(x, y_sin, 'blue', marker='*',linewidth=2, markersize=9)
ax3.plot(x, y_cos)
ax4.plot(x, y_cos, color='cyan', marker='+', linestyle='dashed')
##填充两条线之间的颜色
#data_obj = {'x': x,
            'y1': 2 * x + 1,
            'y2': 3 * x + 1.2,
            'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}
#ax.fill_between('x', 'y1', 'y2', color='yellow', data=data_obj)
plt.show()

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
输出从start到stop的等差数列,num为元素个数,默认50个。

文末将附上marker的属性。

2.2 散点图

只画点,不用线连接。

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
x = np.arange(10)
y = np.random.randn(10)
plt.scatter(x, y,s=area color='yellow', marker='p')#把p换成o则为气泡图,s处可以定义气泡大小。
plt.show()

1、plt.scatter(x, y, color=‘yellow’, marker=‘p’)解释如下:

plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, ***, data=None, **kwargs)

参数的解释:

x,y:表示的是大小为(n,)的数组,也就是我们即将绘制散点图的数据点

s:是一个实数或者是一个数组大小为(n,),这个是一个可选的参数。

c:表示的是颜色,也是一个可选项。默认是蓝色’b’,表示的是标记的颜色,或者可以是一个表示颜色的字符,或者是一个长度为n的表示颜色的序列等等,感觉还没用到过现在不解释了。但是c不可以是一个单独的RGB数字,也不可以是一个RGBA的序列。可以是他们的2维数组(只有一行)。

marker:表示的是标记的样式,默认的是’o’。

cmap:Colormap实体或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap

norm:Normalize实体来将数据亮度转化到0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认为colors.Normalize。

vmin,vmax:实数,当norm存在的时候忽略。用来进行亮度数据的归一化。

alpha:实数,0-1之间。

linewidths:也就是标记点的长度。

2、y = np.random.randn(10)解释如下:

numpy.random.rand(d0,d1,…,dn)

  • rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
  • dn表格每个维度
  • 返回值为指定维度的array

2.3 条形图

条形图分两种,一种是水平的,一种是垂直的。

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
x = np.arange(10)
y = np.random.randn(10)

fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1. / 2))

vert_bars = axes[0].bar(x, y, color='lightblue', align='center')
horiz_bars = axes[1].barh(x, y, color='blue', align='center')
# 在水平或者垂直方向上画线
axes[0].axhline(0, color='gray', linewidth=2)
axes[1].axvline(0, color='gray', linewidth=2)
plt.show()

1、subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

nrows,ncols:子图的行列数。
sharex, sharey:

设置为 True 或者 ‘all’ 时,所有子图共享 x 轴或者 y 轴,
设置为 False or ‘none’ 时,所有子图的 x,y 轴均为独立,
设置为 ‘row’ 时,每一行的子图会共享 x 或者 y 轴,
设置为 ‘col’ 时,每一列的子图会共享 x 或者 y 轴。
squeeze:

默认为 True,是设置返回的子图对象的数组格式。
当为 False 时,不论返回的子图是只有一个还是只有一行,都会用二维数组格式返回他的对象。
当为 True 时,如果设置的子图是(nrows=ncols=1),即子图只有一个,则返回的子图对象是一个标量的形式,如果子图有(N×1)或者(1×N)个,则返回的子图对象是一个一维数组的格式,如果是(N×M)则是返回二位格式。
subplot_kw:

字典格式,传递给 add_subplot() ,用于创建子图。
gridspec_kw:

字典格式,传递给 GridSpec 的构造函数,用于创建子图所摆放的网格。
class matplotlib.gridspec.GridSpec(nrows, ncols, figure=None, left=None, bottom=None, right=None, top=None, wspace=None, hspace=None, width_ratios=None, height_ratios=None)
如,设置 gridspec_kw={‘height_ratios’: [3, 1]} 则子图在列上的分布比例是3比1。
**fig_kw :

所有其他关键字参数都传递给 figure()调用。
如,设置 figsize=(21, 12) ,则设置了图像大小。

返回值
fig: matplotlib.figure.Figure 对象
ax:子图对象( matplotlib.axes.Axes)或者是他的数组

2.4 直方图

直方图用于统计数据出现的次数或者频率,有多种参数可以调整。

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)

n_bins = 10
x = np.random.randn(999, 3)

fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flatten()

colors = ['blue', 'yellow', 'cyan']
ax0.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
ax0.legend(prop={'size': 10})
ax0.set_title('bars with legend')

ax1.hist(x, n_bins, density=True, histtype='barstacked',color=colors)
ax1.set_title('stacked bar')

ax2.hist(x, histtype='barstacked', color=colors,rwidth=0.5)
ax2.set_title('stacked bar')

ax3.hist(x[:, 0], color='lightgray',rwidth=0.8)
ax3.set_title('different sample sizes')

fig.tight_layout()
plt.show()

1、flatten()函数用法

flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组。

flatten只能适用于numpy对象,即array或者mat,普通的list列表不适用!。

a.flatten():a是个数组,a.flatten()就是把a降到一维,默认是按行的方向降 。
a.flatten().A:a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组。

hist函数

ax.hist(density=True, histtype='bar', stacked=True)
density:如果是True,则返回元组的第一个元素为概率密度,即直方图面积和为1。

histtype
bar”是传统的条形直方图。如果给定多个数据,则条并排排列。
barstacked”是一种条形直方图,其中多个数据相互叠加。
step”生成默认为未填充的线条图。
stepfilled”生成默认填充的线条图。

stacked:如果为True,则多个数据堆叠在一起;如果为False,则多个数据并排排列;默认为False。

2.5 饼图

饼图自动根据数据的百分比画饼。labels是各个块的标签。autopct=%1.1f%%表示格式化百分比精确输出,explode,突出某些块,不同的值突出的效果不一样。pctdistance=1.12百分比距离圆心的距离,默认是0.6

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)

labels = ['apple', 'banana', 'watermelon', 'strawberry','else']
sizes = [10, 35, 25, 25,5]
explode = (0, 0.1, 0, 0,0)


fig1, (ax1, ax2) = plt.subplots(2)
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True)
ax1.axis('equal')

ax2.pie(sizes, autopct='%1.2f%%', shadow=True, startangle=90,
        explode=explode, pctdistance=1.12)
ax2.axis('equal')
ax2.legend(labels=labels,loc='upper right')
plt.show()

2.8 等高线(轮廓图)

有时候需要描绘边界的时候,就会用到轮廓图,机器学习用的决策边界也常用轮廓图来绘画,

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)
fig, (ax1, ax2) = plt.subplots(2)
x = np.arange(-8, 3, 0.1)
y = np.arange(-3, 7, 0.1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx ** 2 + yy ** 2) / (xx ** 2 + yy ** 2)
ax1.contourf(x, y, z)
ax2.contour(x, y, z)
plt.show()

contourf会填充轮廓线之间的颜色。数据x, y, z通常是具有相同shape的二维矩阵。x, y可以为一维向量,但是必需有z.shape = (y.n, x.n),这里y.nx.n分别表示x、y的长度。Z通常表示的是距离X-Y平面的距离,传入X、Y则是控制了绘制等高线的范围。

附上marker表


<img src="C:\Users\xxx\AppData\Roaming\Typora\typora-user-images\image-20201125114512523.png" alt="image-20201125114512523" style="zoom:50%;" />

`contourf`会填充轮廓线之间的颜色。数据`x, y, z`通常是具有相同`shape`的二维矩阵。`x, y`可以为一维向量,但是必需有`z.shape = (y.n, x.n)`,这里`y.n`和`x.n`分别表示`x、y`的长度。`Z`通常表示的是距离`X-Y`平面的距离,传入`X、Y`则是控制了绘制等高线的范围。

附上marker表

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201125131218146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUxNjkxMDAx,size_16,color_FFFFFF,t_70#pic_center)


转载:https://blog.csdn.net/qq_51691001/article/details/110123912
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场