matplotlib从起点出发(4)_Tutorial_4_Lifecycle

1 一幅图像的生命周期

本教程旨在揭示使用matplotlib绘制的一幅图像的生命周期,包括它的开始、中间和结束。我们将从一些原始数据开始,最后保存自定义可视化的图形。在此过程中,我们尝试使用matplotlib突出一些简洁的功能和最佳实践。

2 关于显示接口和隐式接口的说明

matplotlib有两个接口。有关显示接口和隐式接口之间权衡的说明,请参阅matplotlib应用程序接口(API)。

在显式面向对象接口中,我们直接使用axes的实例。用于在图形实例中构建可视化的figure.figure。在受MATLAB启发并建模的隐式接口中,我们使用封装在pyplot模块中的基于全局状态的接口来绘制到当前轴。请参阅pyplot教程,更深入地了解pyplot接口。

大多数术语都很简单,但要记住的主要事情有:

  • Figure是最终的图像,可能包括一个或者多个axes
  • axes代表一个独立的绘图(不要和axis混淆,后者是指图中的x-、y-或z-轴)。

我们调用直接从axes进行绘图的方法,这为我们在自定义绘图时提供了更大的灵活性和功能。

注意
通常,使用显式接口而不是隐式pyplot接口进行绘图。

3 数据

我们将使用派生本教程的帖子中的数据。它包含一些公司的销售信息。

import numpy as np
import matplotlib.pyplot as plt


data = {'Barton LLC': 109438.50,
        'Frami, Hills and Schmidt': 103569.59,
        'Fritsch, Russel and Anderson': 112214.71,
        'Jerde-Hilpert': 112591.43,
        'Keeling LLC': 100934.30,
        'Koepp Ltd': 103660.54,
        'Kulas Inc': 137351.96,
        'Trantow-Barrows': 123381.38,
        'White-Trantow': 135841.99,
        'Will LLC': 104437.60}
group_data = list(data.values())
group_names = list(data.keys())
group_mean = np.mean(group_data)

4 启程

此数据自然可视化为柱形图,每组一条柱形。为了使用面向对象的方法做到这一点,我们首先生成一个图形的figure.Figure实例。图形就像一个画布,axes是该画布的一部分,我们将在其上进行特定的可视化。

在这里插入图片描述

我们这就产生了一个axes实例,我们能够在它的顶层绘图。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)

在这里插入图片描述

5 控制风格

Matplotlib中有许多可用的样式,以便你根据需要定制可视化。要查看样式列表,我们可以使用style。

print(plt.style.available)

可以得到

['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

你可以使用下列的语句激活一种样式:

plt.style.use('fivethirtyeight')

现在让我们重新绘制一下之前的图形,再看一下结果:

fig, ax = plt.subplots()
ax.barh(group_names, group_data)

在这里插入图片描述

可以看出这个图没有边框,标签字体也比较大。
这里的样式控制了很多方面,例如颜色、线宽、背景等等。

6 自定义绘图

现在我们得到了一个具有我们想要的一般外观的情节,所以让我们对其进行微调,以便它准备好打印。首先,让我们旋转x轴上的标签,以便它们更清晰地显示。我们可以使用axes.Axes.xticklabels()来访问这些标签。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()

如果我们想一次设置多个项目的属性,使用pyplot.setp()函数很有用。这将获取 matplotlib对象中的一个(或多个列表),并尝试为每个对象设置一些样式元素。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

在这里插入图片描述

看起来这样切断了底部的一些标签。我们可以告诉matplotlib自动为我们创建的图形中的元素腾出空间。为此,我们设置了rcParams的自动布局值。有关使用rcParams控制图的样式、布局和其他功能的详细信息。

plt.rcParams.update({'figure.autolayout': True})

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

在这里插入图片描述

接下来,我们向图添加标签。要使用面向对象接口执行此操作,我们可以使用Artist.set()方法来设置此axes对象的属性。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')

在这里插入图片描述

我们还可以使用pyplot.subplots()函数调整此图的大小。我们可以使用figsize关键字参数来做到这一点。

注意
虽然Numpy中的索引遵循顺序(行、列),但figsize关键字参数遵循顺序(宽、高)。这遵循可视化中的约定,不幸的是,这些约定与线性代数的约定不同。

fig, ax = plt.subplots(figsize=(8, 4))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')

在这里插入图片描述

对于标签,我们可以以函数的形式指定自定义格式指南。下面我们定义一个函数,该函数将整数作为输入,并返回一个字符串作为输出。当与Axis.set_major_formatterAxis.set_minor_formatter一起使用时,它们将自动创建和使用一个ticker.FuncFormatter类。

对于此函数,x参数是原始即时刻度标签,pos是即时刻度标签。我们在这里只使用x,但两个参数都是必需的。

def currency(x, pos):
    """The two arguments are the value and tick position"""
    if x >= 1e6:
        s = '${:1.1f}M'.format(x*1e-6)
    else:
        s = '${:1.0f}K'.format(x*1e-3)
    return s

然后,我们可以将此函数应用于图上的标签。对此,我们使用axes的xaxis属性。这使你可以在我们的绘图上的特定轴上执行操作。

fig, ax = plt.subplots(figsize=(6, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')
ax.xaxis.set_major_formatter(currency)

在这里插入图片描述

7 组合多个可视化效果

可以在同一axes.Axes实例上绘制多个绘图元素。为此,我们只需要在该axes对象上调用另一个绘图方法。

fig, ax = plt.subplots(figsize=(8, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

# 添加一条垂直线,这里我们在函数调用中设置样式
ax.axvline(group_mean, ls='--', color='r')

# 标记新的公司
for group in [3, 5, 8]:
    ax.text(145000, group, "New Company", fontsize=10,
            verticalalignment="center")

# 标题有点低,我们现在把它提高一些
ax.title.set(y=1.05)

ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')
ax.xaxis.set_major_formatter(currency)
ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3])
fig.subplots_adjust(right=.1)

plt.show()

在这里插入图片描述

8 保存图像

现在我们对绘图的结果感到满意,我们想将其保存到磁盘。我们可以在matploblib中保存许多文件格式。要查看可用选项的列表,请使用:

print(fig.canvas.get_supported_filetypes())

输出

{'eps': 'Encapsulated Postscript', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'ps': 'Postscript', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}

然后我们可以使用figure.Figure.savefig()来将图像保存到磁盘。请注意,我们在下面显示了几个有用的标识位:

  • transparent = True 使保存的图形的背景透明(如果格式支持);
  • dpi = 80 控制输出的分辨率(每平方英寸点数);
  • bbox_inches = "tight"自动适应图像的边界。
# 解引用这一行即可保存图像,不透明,dpi为80,边距设置为紧.
# fig.savefig('sales.png', transparent=False, dpi=80, bbox_inches="tight")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/46479.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三子棋(超详解+完整码源)

三子棋 前言一,游戏规则二,所需文件三,创建菜单四,游戏核心内容实现1.棋盘初始化1.棋盘展示3.玩家下棋4.电脑下棋5.游戏胜负判断6.game()函数内部具体实现 四,游戏运行实操 前言 C语言实现三子棋…

maven

一、为什么需要使用maven 如今我们构建一个项目需要用到很多第三方的类库 ,例如我们在开发项目中 需要引入 这些依赖jar包 一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系非常复杂,一个Jar包往往又会引用其他Jar包&#x…

安全学习DAY07_其他协议抓包技术

协议抓包技术-全局-APP&小程序&PC应用 抓包工具-Wireshark&科来分析&封包 TCPDump: 是可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用…

stable diffusion如何确保每张图的面部一致?

可以使用roop插件,确定好脸部图片后,使用roop固定,然后生成的所有图片都使用同一张脸。 这款插件的功能简单粗暴:一键换脸。 如图所示: 任意上传一张脸部清晰的图片,点击启用。 在其他提示词不变的情况下…

赛多利斯Sartorius天平java后端对接

业务场景 要将赛多利斯天平的数据读出来解析并且显示到对应的数字框,支持一台设备连接多种精度的天平 后端实现 通过协议解析数据,然后将数据存储 详细代码就不贴了,感兴趣的可以私聊我

GPT-AI 使用的技术概览

ChatGPT 使用的技术概览 智心AI-3.5/4模型,联网对话,MJ快速绘画 从去年 OpenAI 发布 ChatGPT 以来,AI 的能力再次惊艳了世人。在这样的一个时间节点,重新去学习相关技术显得很有必要。 ChatGPT 的内容很多,我计划采用…

3ds Max图文教程: 创建致命的冠状病毒动画

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 病毒建模 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 在透视视口中创建一个半径为 50,线段为 20 的 GeoSphere。 创建地球 步骤 3 打开修改器列表并将置换修改器应用于地理 球。 置换…

Linux系统MySQL中用户的权限管理

本节主要学习用户权限管理的概述,用户权限类型,用户赋权,权限删除,用户删除等。 目录 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、用户删除 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&am…

Dockerfile 创建镜像,构建LNMP+wordpress架构

目录 一、Dockerfile 构建镜像 1.Dockerfile 构建 nginx镜像 1.1创建 nginx Dockerfile 目录 1.2编写 Dockerfile 文件 1.3构建nginx镜像 2.Dockerfile 构建 mysql 镜像 2.1创建 mysql Dockerfile 目录 2.2修改mysql配置文件 2.3编写 Dockerfile 文件 2.4构建mysql镜…

ChatGPT伦理挑战:人工智能的权利与责任

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

全志F1C200S嵌入式驱动开发(触摸屏驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 触摸屏一般有两种,一种是电阻触摸屏,一种是电容触摸屏。前者需要自己买一颗i2c的信号读取芯片,用的比较多的是ns2009。后者自身集成了读取芯片,用的比较多的是gt911。正好之前测…

(十三)定时任务

以下内容来自 尚硅谷,写这一系列的文章,主要是为了方便后续自己的查看,不用带着个PDF找来找去的,太麻烦! 第 13 章 定时任务 13.1 什么是定时任务 1、InfluxDB任务是一个定时执行的FLUX脚本,它先查询数据…

Docker啥是数据持久化?

文章目录 数据持久化数据卷相关命令创建读写数据卷创建只读数据卷数据卷共享数据卷容器实现数据卷共享nginx实现数据卷共享nfs总结 Dockerfile持久化Dockerfile方式docker run总结 数据持久化 ​ 在容器层的 UnionFS(联合文件系统)中对文件/目录的任何修…

SRC | 逻辑漏洞原理及实战

前言 作者简介:不知名白帽,网络安全学习者。 博客主页:不知名白帽_网络安全,CTF,内网渗透-CSDN博客 网络安全交流社区:https://bbs.csdn.net/forums/angluoanquan 目录 逻辑漏洞基础 概述 分类 URL跳转漏洞 概述 危害 漏洞…

Android:RecyclerView封装,打造列表极简加载

前言 mBinding.recycler.linear().divider().set<OrdinaryListBean> {addLayout(R.layout.layout_ordinary_item)}.setList(getList()) 如果我要说&#xff0c;除了数据和布局之外&#xff0c;以上的几行代码&#xff0c;就实现了一个列表加载&#xff0c;有老铁会相信…

Django学习笔记-表单(forms)的使用

在Django中提供了了form表单&#xff0c;可以更为简单的创建表单模板信息&#xff0c;简化html的表单。 一、网页应用程序中表单的应用 表单通常用来作为提交数据时候使用。 1.1 创建表单模板文件夹 在项目文件夹下创建一个template文件夹&#xff0c;用于存储所有的html模…

XCP详解「总目录」

目录 XCP详解「总目录」 1 概览 2 理论 3 实践 4 其他 XCP详解「总目录」 基础学习&#xff0c;慢慢补充 1 概览 2 理论 3 实践 XCP详解「3.1ASAP2新建A2L文件」 XCP详解「3.2CANape新建工程导入A2L」 XCP详解「3.3A2L信号添加和更新」 XCP详解「3.4CANape中新建A2L文…

学习 C语言第二天 :C语言数据类型和变量(下)

目录&#xff1a; 1.变量的介绍以及存储 2.算术操作符、赋值操作符、单目操作符 3.scanf和printf的介绍 1.变量的介绍以及存储 1.1.变量的创建 了解了什么是类型了&#xff0c;类型是用来创建变量的。 变量是什么呢&#xff1f;在C语言当中不经常变的量称为常量&#xff0c;经常…

Qt : day1

1.聊天界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug() << this->size(); //获取当前页面尺寸this->setFixedSize(500, 600); //设置固定尺寸this->setWindowTitle("聊天框"); //设置窗口…

OpenAI Code Interpreter 的开源实现:GPT Code UI

本篇文章聊聊 OpenAI Code Interpreter 的一众开源实现方案中&#xff0c;获得较多支持者&#xff0c;但暂时还比较早期的项目&#xff1a;GPT Code UI。 写在前面 这篇文章本该更早的时候发布&#xff0c;但是 LLaMA2 发布后实在心痒难忍&#xff0c;于是就拖了一阵。结合 L…