1.用 plt.plot 画散点图

1
2
3
4
5
6
7
%matplotlib inline 
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
x = np.linspace(0,10,30)
y = np.sin(x)
plt.plot(x,y,'o',color='black')

1

plt.plot 的第三个参数是一个字符,表示图形符号的类型。具体的几种类型参见如下代码:

1
2
3
4
5
6
7
8
9
10
%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn-whitegrid')
rng = np.random.RandomState(0)
for i in ['o','.',',','x','+','v','<','>','s','d']:
plt.plot(rng.rand(5),rng.rand(5),i,label = "i='{0}'".format(i))
plt.legend(numpoints=1)
plt.xlim(0,1.8)
plt.axis('tight')

2

这些设置也可以与线条,颜色代码组合起来,画出一条连接散点的线。

1
plt.plot(x,y,'-ok')

3

此外,plt.plot 还支持设置线条和散点的属性。

1
2
3
4
5
6
7
8
plt.plot(x,y,'-p',color='gray'
markersize=15,linewidth=4,markerfacecolor='white',
markeredgecolor='gray',markeredgewidth=2)
#markersize 点的尺寸
#linewidth 线的宽度
#markerfacecolor 散点内部填充颜色
#markeredgecolor 散点边缘颜色
#markeredgewidth 散点边缘线宽

4

2.用 plt.scatter 画散点图

1
plt.scatter(x,y,marker='o')

5

plt.scatter 和 plt.plot 的主要差别在于,前者在创建散点图时具有很高的灵活性,可以控制每个散点与数据匹配,也可以让每个散点具有不同的属性(大小,表面颜色,边框颜色等)

1
2
3
4
5
6
7
8
9
10
11
%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn-whitegrid')
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
color = rng.rand(100)
sizes = 1000*rng.rand(100)
plt.scatter(x,y,c=color,s=sizes,alpha=0.3,cmap='viridis')
plt.colorbar() #显示颜色条

书上写的太少了,看一下官方帮助文档

1
2
3
4
5
6
7
8
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,*,
plotnonfinite=False,data=None,**kwargs,)
#x,y 数据位置
#s 形状大小
#c 颜色,颜色序列
#marker 可选标记样式 默认为 None
1
2
3
4
5
6
7
8
9
%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn-whitegrid')
x = np.random.randn(10)
y = np.random.randn(10)
sizes= 1000*(np.random.RandomState(0).rand(10))
color = ['r','w','g','b','c','m','y','k','g','b']
plt.scatter(x,y,c=color,s=sizes,marker='o')

6

1
#cmap 可选,默认值无 一个颜色样式关键字和元素映射的集合类 可选参数有{'viridis', 'inferno', 'plasma', 'magma'}等

cmap 的参数可参见下面地址:
https://matplotlib.org/examples/color/colormaps_reference.html

1
2
3
4
5
6
7
#norm 亮度选择 默认无
#vmin,vmax 标量,可选,默认无
#vmin,vmax,norm 一起使用以规范化亮度数据,如果没有,则分别为颜色的最小值和最大值,如果传递norm, 则忽略 vmin 和 vmax。
#appha 透明度
#linewidths 线宽
#edgecolors : {'face', 'none', *None*} 边缘颜色 可选
#选择 face 时,与填充颜色一样;选择 none 时,不会绘制边缘

3.基本误差线

基本误差线可以使用一个 Matplotlib 函数来创建,代码如下:

1
2
3
4
5
6
7
8
%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn-whitegrid')
x = np.linspace(0,10,50)
dy = 0.8
y = np.sin(x)+dy*np.random.randn(50)
plt.errorbar(x,y,yerr=dy,fmt='-b',ecolor='lightblue')

1

关于这个函数来看一下帮助文档:

1
2
3
4
5
6
7
plt.errorbar(x,y,yerr=None,xerr=None,
fmt='',ecolor=None,elinewidth=None,capsize=None,
barsabove=False,lolims=False,uplims=False,
xlolims=False,xuplims=False,errorevery=1,
capthick=None,*,data=None,**kwargs,)
#Plot y versus x as lines and/or markers with attached errorbars.
#将y与x绘制为带有误差条的直线或标记
参数解析
1.x,y 参数定义数据的位置,xerr、yerr 定义错误栏的尺寸。
1
2
3
4
5
6
7
#xerr, yerr : scalar or array-like, shape(N,) or shape(2,N), optional
#The errorbar sizes:
#- scalar: Symmetric +/- values for all data points.
#- shape(N,): Symmetric +/-values for each data point.
#- shape(2,N): Separate - and + values for each bar. First rowcontains the lower errors, the second row contains the upper errors.
#-*None*: No errorbar.
#综上,xerr、yerr 可以是一个标量也可以是一组与点集匹配个数的数值,且所以的偏差数值都为正
1
2
3
4
5
6
7
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,100)
y = np.sin(x)
plt.errorbar(x,y,xerr=0.1,yerr=0.1,ecolor='lightblue')
plt.axis('tight')

1

1
2
3
4
5
6
7
8
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,100)
y = np.sin(x)
dx = np.random.randn(100)
plt.errorbar(x,y,xerr=dx,yerr=0.1,ecolor='lightblue')
plt.axis('tight')

1

2.fmt/ecolor

定义线条输出的样式/定义颜色参数。

3.elinewidth/capsize

定义误差线的宽度,默认无/定义误差线的长度。

4.capthick

以点为单位控制误差线的粗细。

1
2
3
4
5
6
7
8
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,100)
y = np.sin(x)
dx = np.random.randn(100)
plt.errorbar(x,y,xerr=dx,yerr=0.1,fmt=':g',ecolor='r',elinewidth=0.5,capsize=0.8,capthick=0.1)
plt.axis('tight')

1

5.barsabove

默认为 False ,值为真的时候,将在绘图上方绘制错误栏符号。

默认值如下:lolims,uplims,xlolims,xuplims:bool,可选,默认:False,这些参数可用于指示仅给出上限/下限。

这里看一下加上参数后的输出:

参数 输出
(-2.127332873372947, 12.317047400898497, 1.209338402537363, 1.209646185811039)
lolims (-1.7463742344012507, 11.922255103041191, -1.209338402537363, 1.209646185811039)
uplims (-3.837999180023531, 11.924314429569236, -1.209338402537363, 1.209646185811039)
xlolims/xuplims:bool <ErrorbarContainer object of 3 artists>
6.errorevery 设定值为正整数,对误差条进行子采样
1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,100)
y = np.sin(x)
dx = np.random.randn(100)
plt.errorbar(x,y,xerr=dx,yerr=0.1,fmt=':g',ecolor='r',elinewidth=0.5,capsize=0.8,capthick=0.1,barsabove='lolims',errorevery=5)
plt.axis('tight')

1

连续误差

有时候我们需要处理连续的误差情况,Matplotlib 中没有内置的方法,不过我们可以用 plt.plot 和 plt.fill_betweem 来解决这个问题。

来看一下 plt.fill_between 的帮助文档:

1
2
3
4
5
6
7
#Signature:
plt.fill_between(x,y1,y2=0,where=None,
interpolate=False,step=None,*,
data=None,**kwargs,)
#Docstring:
#Fill the area between two horizontal curves.
#功能就是将两个坐标(x,y1),(x,y2)之间的区域填充
参数说明
1.x,y1,y2

都是数组,x 定义曲线节点的 x 坐标,y1 定义第一条曲线的节点的 y 坐标, y2 定义第二条曲线的节点的 y 坐标。

2.where 、interpolate

where 定义填充区域的坐标以此来排除某些地方不被填充。

interpolate 的功能是将填充交叉的地方设置为填充还是减去。默认为减去。

.3.step {‘pre’, ‘post’, ‘mid’}

定义步骤,如果给值,三个关键词的情况如下:

pre:x[i-1] ~ x[i]

post: x[i] ~ x[i+1]

mid: x位置的中间

1
2
3
4
5
6
7
8
9
10
import matplotlib.pyplot as plt
import numpy as np
z = np.linspace(0,2,5)
x = np.array([0.1,0.2,0.3,0.4])
y = np.array([0.2,0.3,0.4,0.5])
dx = np.array([0.2,0.3,0.4,0.5])
dy = np.linspace(0,1,4)
plt.plot(x,y,'or')
plt.plot(x,dy,'-',color='gray')
plt.fill_between(x,y,dy,color='gray',alpha=0.2)

5

这个我们尝试构建出一段连续的误差阴影,x、dx 为数据点,x,dy 为误差点,我们利用 plt.fill_between 函数将其中(x,dx),(x,dy) 的误差区域用灰色填充。