pyplot快速入门——应用接口
bigegpt 2024-09-24 07:13 3 浏览
pyplot的应用接口
本文主要介绍pyplot的应用接口 matplotlib.pyplot是一个函数集,可以让matplotlib像MATLAB一样工作,每一个pyplot函数都会让一个Figure对象产生一些变化,如创建一个画布(Figure),在Figrue上创建一个绘图区,在绘图区中画一些线条,给图形加标签等。
在matplotlib.pyplot中,对图形状态的保存贯穿函数的调用过程,所以它可以跟踪一些东西,如当前的Figure和绘图区域,绘图函数指向当前的axes(坐标系)——注意,这里的axes和大多数文档里提到的,指的是图形的坐标系部分,而不是数学意义上的多个坐标轴。
注意:隐式调用的bylot API通常比显式调用的API更简单一些。大多数你这里调用的方法也可以用Axes对象来调用。我们建议多浏览教程和示例来加深对它们如何工作的理解。
使用pyplot生成可视化效果非常快:
In [1]:
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
您也许会好奇,为什么x轴的取值范围是0到3,而y轴的取值范围是1到4。如果您提供了一个简单的list列表或array数组给plot,matplotlib就会认定那是一列y值,并会为您自动生成一系列的x值。由于Python的ranges从0开始,默认的x矢量值就会从0开始且与y具有相同的长度,也就是说,x的值是[0,1,2,3]。 plot是一个多用途函数,并且可以带着任意数量的参数。比如,要想同时画上x和y,您可以:
In [2]:
plt.plot([1,2,3,4],[1,4,9,16])
Out[2]:
[<matplotlib.lines.Line2D at 0xffff5e2f26a0>]
格式化您的plot风格
对于每一个x,y坐标参数,有第三个可选参数,即格式化字符,定义了图的颜色和线形,字符中的字母和符号来自于MATLAB,您可以联合颜色字符串和线形字符串,默认的字符串是“b-”,是一个蓝色的实线。如果您想让上图输出一个红点图,需要输入:
In [3]:
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.axis([0,6,0,20])
plt.show()
查看完整的风格对应字符列表见plot文档。上面的axis方法取了一个[xmin,xmax,ymin,ymax]的参数列表,并在轴上显示出来。
如果matplotlib仅限于处理列表 ,那它对数据处理来说,真的很没用,通常,您会使用numpy数组,事实上,所有的列表在内部都转化成了numpy的数组了。下面的例子在用一个函数用不同的风络绘制了多条线。
In [4]:
import numpy as np
t = np.arange(0.,5.,0.2)
plt.plot(t,t,'r--',t,t**2,'bs',t,t**3,'g^')
plt.show()
使用关键字绘图
在一些特殊的例子里,有一些数据可以接收特殊的字符串做为变量。比如numpy.recarray或pandas.DataFrame。Matplotlib允许您提供这样一个对象:使用data关键字参数。如果您提供了,然后您就可以用字符串生成相应的图象。
In [5]:
data = {'a':np.arange(50),
'c':np.random.randint(0,50,50),
'd':np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
plt.scatter('a','b',c='c',s='d',data=data)
plt.xlabel('entry a')
plt.ylabel('entry b')
plt.show()
用分类变量绘图
Matplotlib的很多函数允许您直接使用分类变量,如:
In [6]:
names = ['group_a','group_b','group_c']
values = [1,10,100]
plt.figure(figsize=(9,3))
plt.subplot(131)
plt.bar(names,values)
plt.subplot(132)
plt.scatter(names,values)
plt.subplot(133)
plt.plot(names,values)
plt.suptitle('Categorical Plotting')
plt.show()
对线型进行控制
线型有很多您可以控制的参数:线宽、点划、锯齿等,详细内容可以查matplotlib.lines.line2D,有几种方式可以设置线型。
- 使用关键字参数: plt.plot(x,y,linewidth=2.0)
- 使用对象实例的设置方法。plot返回一个Line2D的对象列表,比如,line1,line2 = plot(x1,y1,x2,y2)。在下面的代码中,我们假设我们只有一条线,我们使用tuple来解包line,来获得列表的元素。line, = plt.plot(x,y,'-') line.set_antialiased(False) #关闭锯齿
- 使用 setp。下面的这个例子使用了一个MATLAB风格的函数在一列里来设置多个参数,setp可以简明地处理一列对象或者一个对象,您既可以使用python的关键字参数也可以使用MATLAB风格的字符串/值对:lines = plt.plot(x1,y1,x2,y2) # 使用关键字参数 plt.setp(lines,color='r',linewidth=2.0) # 或者使用MATLAB风格的字符串/值对 plt.setp(lines,'color','r','linewidth',2.0)
这里是一些可用的Line2D的property。
要获取可设置特色的列表,请使用一行或多行参数来调用setp函数。
In [16]:
lines = plt.plot([1,2,3])
plt.setp(lines)
agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array and two offsets from the bottom left corner of the image
alpha: scalar or None
animated: bool
antialiased or aa: bool
clip_box: `.Bbox`
clip_on: bool
clip_path: Patch or (Path, Transform) or None
color or c: color
dash_capstyle: `.CapStyle` or {'butt', 'projecting', 'round'}
dash_joinstyle: `.JoinStyle` or {'miter', 'round', 'bevel'}
dashes: sequence of floats (on/off ink in points) or (None, None)
data: (2, N) array or two 1D arrays
drawstyle or ds: {'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post'}, default: 'default'
figure: `.Figure`
fillstyle: {'full', 'left', 'right', 'bottom', 'top', 'none'}
gid: str
in_layout: bool
label: object
linestyle or ls: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}
linewidth or lw: float
marker: marker style string, `~.path.Path` or `~.markers.MarkerStyle`
markeredgecolor or mec: color
markeredgewidth or mew: float
markerfacecolor or mfc: color
markerfacecoloralt or mfcalt: color
markersize or ms: float
markevery: None or int or (int, int) or slice or list[int] or float or (float, float) or list[bool]
path_effects: `.AbstractPathEffect`
picker: float or callable[[Artist, Event], tuple[bool, dict]]
pickradius: float
rasterized: bool
sketch_params: (scale: float, length: float, randomness: float)
snap: bool or None
solid_capstyle: `.CapStyle` or {'butt', 'projecting', 'round'}
solid_joinstyle: `.JoinStyle` or {'miter', 'round', 'bevel'}
transform: `.Transform`
url: str
visible: bool
xdata: 1D array
ydata: 1D array
zorder: float
您可以使用对齐参数horizontalalignment,verticalalignment,multialignment布局文本。horizontalalignment控制着x位置参数是指文本边界的左侧、中间还是右侧,vertialignment控制文本的y位置参数是文本边界框的底部、中心或顶部,multialignment仅用有换行分隔符的字符串,控制不同行的左对齐,居中对齐和右对齐。下面是一个使用text()命令显示对齐情况的示例,代码中使用的transform=ax.transAxes表示坐标是相对于坐标系边界框给出的,(0,0)是轴的左下角,(1,1)是右上角。
In [21]:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
left,width = .25,.5
bottom,height = .25,.5
right = bottom + height
top = bottom + height
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
p = patches.Rectangle(
(left,bottom),width,height,
fill = False,transform=ax.transAxes,clip_on=False)
ax.add_patch(p)
ax.text(left,bottom,'left top',
horizontalalignment='left',
verticalalignment='top',
transform=ax.transAxes)
ax.text(left, bottom, 'left bottom',
horizontalalignment='left',
verticalalignment='bottom',
transform=ax.transAxes)
ax.text(right, top, 'right bottom',
horizontalalignment='right',
verticalalignment='bottom',
transform=ax.transAxes)
ax.text(right, top, 'right top',
horizontalalignment='right',
verticalalignment='top',
transform=ax.transAxes)
ax.text(right, bottom, 'center top',
horizontalalignment='center',
verticalalignment='top',
transform=ax.transAxes)
ax.text(left, 0.5*(bottom+top), 'right center',
horizontalalignment='right',
verticalalignment='center',
rotation='vertical',
transform=ax.transAxes)
ax.text(left, 0.5*(bottom+top), 'left center',
horizontalalignment='left',
verticalalignment='center',
rotation='vertical',
transform=ax.transAxes)
ax.text(0.5*(left+right), 0.5*(bottom+top), 'middle',
horizontalalignment='center',
verticalalignment='center',
fontsize=20, color='red',
transform=ax.transAxes)
ax.text(right, 0.5*(bottom+top), 'centered',
horizontalalignment='center',
verticalalignment='center',
rotation='vertical',
transform=ax.transAxes)
ax.text(left, top, 'rotated\nwith newlines',
horizontalalignment='center',
verticalalignment='center',
rotation=45,
transform=ax.transAxes)
# ax.set_axis_off()
plt.show()
多画板和坐标系
MATLAB,以及pyplot,是有一个当前画板和当前坐标系的概念。所有的画图方法支持当前的坐标系。方法gca返回当前坐标系(一个matplotlib.axes.Axes实例),gcf方法返回当前画板(一个matplotlib.figure.Figure实例)。正常来说,你不必关心这个事儿,因为那是在场景后台需要关心的。下面是一个创建两个子图的脚本。
In [8]:
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0,5.0,0.1)
t2 = np.arange(0.0,5.0,0.02)
plt.figure()
plt.subplot(211)
plt.plot(t1,f(t1),'bo',t2,f(t2),'k')
plt.subplot(212)
plt.plot(t2,np.cos(2*np.pi*t2),'r--')
plt.show()
这里调用的figure是可选的,因为一个figure对象将会在不存在的情况下被创建,就像是Axes被创建时一样(等同于显式创建subplot())。调用subplot时参数有行数,列数,图号,图号多1开始排,总量是行数列数。当行数列数<10时,逗号可以省略。所以subplot(211)也就是subplot(2,1,1)。
您可以创建任意数量的子图和坐标系,如果您想要手动放置一个Axes,使用axes([left,bottom,width,height])函数,所有值的取值范围都是0-1,代表它与Figure的比值。
您可以使用多个figure方法来创建多个Figure。当前,每一个figure可以包含多少axes和子图,您说了算。
In [9]:
import matplotlib.pyplot as plt
plt.figure(1) # 第一个Figure
plt.subplot(211)
plt.plot([1,2,3])
plt.subplot(212)
plt.plot([4,5,6])
plt.figure(2) # 第二个Figure
plt.plot([4,5,6])
plt.figure(1)
plt.subplot(211)
plt.title('Easy')
Out[9]:
Text(0.5, 1.0, 'Easy')
您可以用clf来清除当前figure,也可以用cla来清除当前axes。如果您创建了很多个figure,您需要知道一件事儿,在figure显式的调用close方法之前,内存中的figure对象是不会被释放的。即使是删除它的所有引用,或用在窗口中关闭都不够,因为pyplot还在内部引用它。
关于文本
text方法被用于在任意位置添加文本,xlabel,ylabel和title被用于在指定位置添加文本。
In [13]:
mu,sigma = 100,15
x = mu + sigma*np.random.randn(10000)
n,bins,patches = plt.hist(x,50,density=True,facecolor='g',alpha=0.75) #数据直方图
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60,0.025,r'$\mu=100,\ \sigma=15#39;) #位置是坐标系的坐标点
plt.axis([40,160,0,0.03]) # x,y轴的显示范围
plt.grid(True)
plt.show()
所有的text方法返回一个matplotlib.text,Text实例,您可以通过传入关键字参数来text来定制特性或者用setp也可以。 t = plt.xlabel('My data',fontsize=14,color='red')
在Text中使用数学表达式
plt.title(r'$\sigma_i=15#39;)
注释文本
上面基础的text方法可以放置到Axes的任意位置,文本的一个常见用途是注释绘图的某些特征,annotate方法提供了一些方便的功能。在一个注释里,需要考虑两点:由参数xy表示的注释位置和文本xytext的位置,这两个参数都是(x,y)元组。
In [14]:
ax = plt.subplot()
t = np.arange(0.0,5.0,0.01)
s = np.cos(2*np.pi*t)
line,=plt.plot(t,s,lw=2)
plt.annotate('local max',xy=(2,1),xytext=(3,1.5),
arrowprops=dict(facecolor='black',shrink=0.05))
plt.ylim(-2,2)
plt.show()
在这个示例里,不管xy(箭尖)和xytext(文本位置)都在数据坐标中。
对数轴和其他非线性轴
matplotlib.pyplot不仅支持线性轴刻度,还支持对数和逻辑回归刻度。如果数据跨越多个数量级,则通常使用此方法。更改轴的比例很简单: plt.xscal('log') 一个例子,四个图,用相同的数据,不同的y轴比例
In [15]:
# Fixing random state for reproducibility
np.random.seed(19680801)
# make up some data in the open interval (0, 1)
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
# plot with various axes scales
plt.figure()
# linear
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
# log
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)
# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthresh=0.01)
plt.title('symlog')
plt.grid(True)
# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
# Adjust the subplot layout, because the logit one may take more space
# than usual, due to y-tick labels like "1 - 10^{-3}"
plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,
wspace=0.35)
plt.show()
In [ ]:
s
- 上一篇:周一分享(九十五):Matlab精读复刻论文之代码复刻10
- 下一篇:Hough变换
相关推荐
- C#.NET Autofac 详解(c# autoit)
-
简介Autofac是一个成熟的、功能丰富的.NET依赖注入(DI)容器。相比于内置容器,它额外提供:模块化注册、装饰器(Decorator)、拦截器(Interceptor)、强o的属性/方法注...
- webapi 全流程(webapi怎么部署)
-
C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...
- .NET外挂系列:3. 了解 harmony 中灵活的纯手工注入方式
-
一:背景1.讲故事上一篇我们讲到了注解特性,harmony在内部提供了20个HarmonyPatch重载方法尽可能的让大家满足业务开发,那时候我也说了,特性虽然简单粗暴,但只能解决95%...
- C# 使用SemanticKernel调用本地大模型deepseek
-
一、先使用ollama部署好deepseek大模型。具体部署请看前面的头条使用ollama进行本地化部署deepseek大模型二、创建一个空的控制台dotnetnewconsole//添加依赖...
- C#.NET 中间件详解(.net core中间件use和run)
-
简介中间件(Middleware)是ASP.NETCore的核心组件,用于处理HTTP请求和响应的管道机制。它是基于管道模型的轻量级、模块化设计,允许开发者在请求处理过程中插入自定义逻辑。...
- IoC 自动注入:让依赖注册不再重复劳动
-
在ASP.NETCore中,IoC(控制反转)功能通过依赖注入(DI)实现。ASP.NETCore有一个内置的依赖注入容器,可以自动完成依赖注入。我们可以结合反射、特性或程序集扫描来实现自动...
- C#.NET 依赖注入详解(c#依赖注入的三种方式)
-
简介在C#.NET中,依赖注入(DependencyInjection,简称DI)是一种设计模式,用于实现控制反转(InversionofControl,IoC),以降低代码耦合、提高可...
- C#从零开始实现一个特性的自动注入功能
-
在现代软件开发中,依赖注入(DependencyInjection,DI)是实现松耦合、模块化和可测试代码的一个重要实践。C#提供了优秀的DI容器,如ASP.NETCore中自带的Micr...
- C#.NET 仓储模式详解(c#仓库货物管理系统)
-
简介仓储模式(RepositoryPattern)是一种数据访问抽象模式,它在领域模型和数据访问层之间创建了一个隔离层,使得领域模型无需直接与数据访问逻辑交互。仓储模式的核心思想是将数据访问逻辑封装...
- C#.NET 泛型详解(c# 泛型 滥用)
-
简介泛型(Generics)是指在类型或方法定义时使用类型参数,以实现类型安全、可重用和高性能的数据结构与算法为什么需要泛型类型安全防止“装箱/拆箱”带来的性能损耗,并在编译时检测类型错误。可重用同一...
- 数据分析-相关性分析(相关性 分析)
-
相关性分析是一种统计方法,用于衡量两个或多个变量之间的关系强度和方向。它通过计算相关系数来量化变量间的线性关系,从而帮助理解变量之间的相互影响。相关性分析常用于数据探索和假设检验,是数据分析和统计建模...
- geom_smooth()函数-R语言ggplot2快速入门18
-
在每节,先运行以下这几行程序。library(ggplot2)library(ggpubr)library(ggtext)#用于个性化图表library(dplyr)#用于数据处理p...
- 规范申报易错要素解析(规范申报易错要素解析)
-
为什么要规范申报?规范申报是以满足海关监管、征税、统计等工作为目的,纳税义务人及其代理人依法向海关如实申报的行为,也是海关审接单环节依法监管的重要工作。企业申报的内容须符合《中华人民共和国海关进出口货...
- 「Eurora」海关编码归类 全球海关编码查询 关务服务
-
海关编码是什么? 海关编码即HS编码,为编码协调制度的简称。 其全称为《商品名称及编码协调制度的国际公约》(InternationalConventionforHarmonizedCo...
- 9月1日起,河南省税务部门对豆制品加工业试行新政7类豆制品均适用投入产出法
-
全媒体记者杨晓川报道9月2日,记者从税务部门获悉,为减轻纳税人税收负担,完善农产品增值税进项税额抵扣机制,根据相关规定,结合我省实际情况,经广泛调查研究和征求意见,从9月1日起,我省税务部门对豆制品...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)