matplotlib模块之plot画图
关于matplotlib中一些常见的函数,https://www.cnblogs.com/TensorSense/p/6802280.html这篇文章讲的比较清楚了,https://blog.csdn.net/ouyangjianxiu/article/details/76299171这个也讲的不错
plot函数
plt.plot(x, y, format_string, **kwargs): x为x轴数据,可为列表或数组;y同理;format_string 为控制曲线的格式字符串, **kwargs 第二组或更多的(x, y, format_string)
format_string: 由 颜色字符、风格字符和标记字符组成。
颜色字符:‘b’蓝色 ;‘#008000’RGB某颜色;‘0.8’灰度值字符串
风格字符:‘-’实线;‘--’破折线; ‘-.’点划线; ‘:’虚线 ; ‘’‘’无线条
标记字符:‘.’点标记 ‘o’ 实心圈 ‘v’倒三角 ‘^’上三角
eg: plt.plot(a, a*1.5, ‘go-’, a, a*2, ‘*’) 第二条无曲线,只有点
plot 显示中文字符
pyplot并不默认支持中文显示,需要rcParams修改字体来实现
rcParams的属性:
‘font.family’ 用于显示字体的名字
‘font.style’ 字体风格,正常’normal’ 或斜体’italic’
‘font.size’ 字体大小,整数字号或者’large’ ‘x-small’
eg:
import matplotlib
matplotlib.rcParams[‘font.family’] = ‘STSong’
matplotlib.rcParams[‘font.size’] = 20
设定绘制区域的全部字体变成 华文仿宋,字体大小为20
中文显示2:只希望在某地方绘制中文字符,不改变别的地方的字体
在有中文输出的地方,增加一个属性: fontproperties
eg:
plt.xlabel(‘横轴:时间’, fontproperties = ‘simHei’, fontsize = 20)
pyplot文本显示函数:
plt.xlabel():对x轴增加文本标签
plt.ylabel():同理
plt.title(): 对图形整体增加文本标签
plt.text(): 在任意位置增加文本
plt. annotate(s, xy = arrow_crd, xytext = text_crd, arrowprops = dict)
: 在图形中增加带箭头的注解。s表示要注解的字符串是什么,xy对应箭头所在的位置,xytext对应文本所在位置,arrowprops定义显示的属性
eg:
plt.xlabel(‘横轴:时间’, fontproperties = ‘SimHei’, fontsize = 15, color = ‘green’)
plt.ylabel(‘纵轴:振幅’, fontproperties = ‘SimHei’, fontsize = 15)
plt.title(r’正弦波实例 $y=cons(2\pi x)$’ , fontproperties = ‘SimHei’, fontsize = 25)
plt.annotate (r’%mu=100$, xy = (2, 1), xytext = (3, 1.5),
arrowprops = dict(facecolor = ‘black’, shrink = 0.1, width = 2)) # width表示箭头宽度
plt.text (2, 1, r’$\mu=100$, fontsize = 15)
plt.grid(True)
plt. annotate(s, xy = arrow_crd, xytext = text_crd, arrowprops = dict)
Plot的图表函数
plt.plot(x,y , fmt) :绘制坐标图
plt.boxplot(data, notch, position): 绘制箱形图
plt.bar(left, height, width, bottom) : 绘制条形图
plt.barh(width, bottom, left, height) : 绘制横向条形图
plt.polar(theta, r) : 绘制极坐标图
plt.pie(data, explode) : 绘制饼图
plt.scatter(x, y) :绘制散点图
plt.hist(x, bings, normed) : 绘制直方图
example:
# matplolib画正弦函数
import numpy as np import matplotlib.pyplot as plt import matplotlib.font_manager as fm zhfont1 = fm.FontProperties(fname='C:\Windows\Fonts\simkai.ttf') x = np.linspace(0,10,100) plt.plot(x,np.sin(x)) plt.title('正弦函数',fontproperties=zhfont1) # 增加参数fontproperties来限定显示的字体, 用此来解决中文显示 plt.xlabel('x') plt.ylabel('sin(x)') plt.show()
# matplotlib画一元n次方程 我们来画一个 f(x)=x^{3}+2x^{2}+3x+4 函数的图形
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
zhfont1 = fm.FontProperties(fname='C:\Windows\Fonts\simkai.ttf')
func = np.poly1d(np.array([1,2,3,4])) # 生成指定的多项式 1,2,3,4是系数 相当于f(x) = 1*x**4 + 2*x**3 + x**3 + 4*x**4
x = np.linspace(-10,10,30)
y = func(x)
plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('y=f(x)')
plt.show()
# matplotlib画多个曲线,我们绘制 f(x)=x^{3}+2x^{2}+3x+4 的同时,再绘制其一阶导函数 f^{'}(x)的图像
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# zhfont1 = fm.FontProperties(fname='C:\Windows\Fonts\simkai.ttf')
matplotlib.rcParams['font.family'] = 'SimHei' # 用来正常显示中文标签
matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.figure(1)
func = np.poly1d(np.array([1,2,3,4]))
func1 = func.deriv(1) # 得到func的一阶导函数
func2 = func.integ() # 得到func的一阶积分函数
x = np.linspace(-10,10,30)
y = func(x)
y1 = func1(x)
y2 = func2(x)
# 在一幅图上画三条曲线
plt.plot(x,y,color='r',label='函数f(x)') # 红色实线
plt.plot(x,y1,'g--',label="函数f'(x)") # 绿色虚线
plt.plot(x,y2,'b-.',label="函数f^2(x)") # 蓝色点划线
plt.legend() # 设置图例和其中的文本的显示
plt.show() # 显示图片
# matplotlib画多个曲线,我们绘制 f(x)=x^{3}+2x^{2}+3x+4 的同时,再绘制其一阶导函数 f^{'}(x)的图像
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# zhfont1 = fm.FontProperties(fname='C:\Windows\Fonts\simkai.ttf')
matplotlib.rcParams['font.family'] = 'SimHei' # 用来正常显示中文标签
matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.figure(1)
func = np.poly1d(np.array([1,2,3,4]))
func1 = func.deriv(1) # 得到func的一阶导函数
func2 = func.integ() # 得到func的一阶积分函数
x = np.linspace(-10,10,30)
y = func(x)
y1 = func1(x)
y2 = func2(x)
# 在一幅图上画三条曲线
# plt.plot(x,y,color='r',label='函数f(x)') # 红色实线
# plt.plot(x,y1,'g--',label="函数f'(x)") # 绿色虚线
# plt.plot(x,y2,'b-.',label="函数f^2(x)") # 蓝色点划线
# plt.legend() # 设置图例和其中的文本的显示
# plt.show() # 显示图片
# 用子图分别画图
plt.subplot(311)
plt.plot(x,y,'r')
plt.title('f(x)')
plt.subplot(312)
plt.plot(x,y1,'g')
plt.title('f(x)的一阶导函数')
plt.subplot(313)
plt.plot(x,y2,'b')
plt.title('f(x)的一阶积分函数')
plt.show()
画散点图
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
plt.scatter(x, np.sin(x), marker='o') # marker 点的形状
plt.grid()
plt.show()
使用plt.sactter相比plt.plot在创建散点图时的优势是具有更高的灵活性,他可以单独控制每一个散点的不同属性(颜色、大小等),这样就可以通过(坐标位置、颜色、大小)这些多维信息,来表征更多的数据特征,
并进行更精细的控制。
我们来绘制这样一组散点图,每个点的位置坐标(x,y)是服从标准正态分布的随机值,点的颜色灰度值是位于(0,1)空间中的随机样本,点的大小是随机值得1000倍,单位是像素。
这样通过位置、大小、颜色等多维信息,就能更丰富的表现出散点数据背后所蕴含的多重信息了。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000*rng.rand(100)
plt.scatter(x,y,c=colors,s=sizes,alpha=0.3) # c 点的颜色 s 点的大小 alpha 点的透明度
plt.colorbar()
plt.grid(True)
plt.show()
画直方图
用bar
from matplotlib import pyplot as plt import numpy as np #这节课,我们学习如何通过matplotlib绘制简单条形图 #第一步,取出一张白纸 fig=plt.figure(1) #第二步,确定绘图范围,由于只需要画一张图,所以我们将整张白纸作为绘图的范围 ax1=plt.subplot(111) #第三步,整理我们准备绘制的数据 data=np.array([15,20,18,25]) #第四步,准备绘制条形图,思考绘制条形图需要确定那些要素 #1、绘制的条形宽度 #2、绘制的条形位置(中心) #3、条形图的高度(数据值) width=0.5 x_bar=np.arange(4) #第五步,绘制条形图的主体,条形图实质上就是一系列的矩形元素,我们通过plt.bar函数来绘制条形图 rect=ax1.bar(left=x_bar,height=data,width=width,color="lightblue") #第六步,向各条形上添加数据标签 for rec in rect: x=rec.get_x() height=rec.get_height() ax1.text(x+0.1,1.02*height,str(height)) #第七步,绘制x,y坐标轴刻度及标签,标题 ax1.set_xticks(x_bar) ax1.set_xticklabels(("first","second","third","fourth")) ax1.set_ylabel("sales") ax1.set_title("The Sales in 2016") ax1.grid(True) ax1.set_ylim(0,28) plt.show()
hist函数
matplotlib.pyplot.hist( x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype=u'bar', align=u'mid', orientation=u'vertical', rwidth=None, log=False, color=None, label=None, stacked=False, hold=None, **kwargs)
x : (n,) array or sequence of (n,) arrays
这个参数是指定每个bin(箱子)分布的数据,对应x轴
bins : integer or array_like, optional
这个参数指定bin(箱子)的个数,也就是总共有几条条状图
normed : boolean, optional
If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e.,n/(len(x)`dbin)
这个参数指定密度,也就是每个条状图的占比例比,默认为1
color : color or array_like of colors or None, optional
这个指定条状图的颜色
我们先画一个最简单的频次直方图,生成1000个服从标准正态分布的随机变量,然后观察他们在每个点的出现次数
import numpy as np import matplotlib.pyplot as plt data = np.random.randn(1000) # print(data) ret = plt.hist(data) print(ret) plt.show()
(array([ 15., 39., 88., 188., 216., 200., 123., 84., 36., 11.]),
array([-2.68292233, -2.1248507 , -1.56677908, -1.00870746, -0.45063583,
0.10743579, 0.66550742, 1.22357904, 1.78165067, 2.33972229,
2.89779391]), <a list of 10 Patch objects>)
我们可以从程序结果看出,hist函数是有返回值的,返回的是一个2元元组,元组第一个ndarray对象是数据条的高度序列,元组第二个ndarray对象是每个数据条的边缘横坐标。
这个图里面只有10个数据条,但是很显然1000个随机变量的取值显然不止10个。在默认情况下,hist函数会将所有的随机变量取值划分为10个取值范围,然后统计每个取值范围内的变量数,
并绘就此图。
另外我们可以通过指定hist函数中的一些参数,来个性化的调整频次直方图的显示效果。
通过bins参数可以指定数据条的个数;normed可以指定是否将频数进行标准化,alpha指定透明度;还有histtype、color、edgecolor等线性、颜色等参数
import numpy as np import matplotlib.pyplot as plt data = np.random.randn(1000) plt.hist(data, bins=40, normed=True, alpha=0.5, histtype='stepfilled',color='steelblue') plt.grid(True) plt.show()
bings将直方图的取值范围进行均等划分bings个区间;
normed =1 表示将出现频次进行了归一化。 normed=0,则为频次;
alpha表示直方图的透明度[0, 1] ;
histtype = ‘stepfilled’ 表示去除条柱的黑色边框
结合频次直方图中的透明度这个参数,我们再来多做做文章,比如,我们想对不同均值、方差分布特征的正态分布随机变量进行对比,那该怎么做?显然我们想到的是把不同的几个正态分布图画在一张图里进行比较。
import numpy as np import matplotlib.pyplot as plt data1 = np.random.normal(0, 0.8, 1000) data2 = np.random.normal(-2, 1, 1000) data3 = np.random.normal(3, 2, 1000) plt.grid(True) kwargs = dict(histtype='stepfilled', alpha=0.5, normed=True, bins=40) plt.hist(data1, **kwargs) plt.hist(data2, **kwargs) plt.hist(data3, **kwargs) plt.show()
基本误差线图
我们在图上画50个散点,然后每个点的误差设定为一个随机值,满足标准正态分布。同时作为对照,我们在另一个图中设置每个点的误差值为一个标量常数而非随机数组。当然这个例子可能没有什么物理意义,只是来演示一下这种图怎么画
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 50) dy = np.random.normal(0, 1, 50) y = np.sin(x) + dy*np.random.randn(50) plt.subplot(211) plt.errorbar(x, y, yerr=dy, fmt='.k') plt.grid(True) plt.subplot(212) plt.errorbar(x, y, yerr=0.8, fmt='o') plt.grid(True) plt.show()