百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

相关推荐

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日起,我省税务部门对豆制品...