图表有很多个组成部分,例如标题、x/y轴名称、大刻度小刻度、线条、数据点、注释说明等等。

我们来看官方给的图,图中标出了各个部分的英文名称

Matplotlib提供了很多api,开发者可根据需求定制图表的样式。

前面我们设置了标题和x/y轴的名称,本文介绍更多设置其他部分的方法。

绘图

先绘制一个事例图。然后以此为基础进行定制。

def demo2():
x_list = []
y_list = []
for i in range(0, 365):
x_list.append(i)
y_list.append(math.sin(i * 0.1))
ax = plt.gca()
ax.set_title('rustfisher.com mapplotlib example')
ax.set_xlabel('x')
ax.set_ylabel('y = sin(x)')
ax.grid()
plt.plot(x_list, y_list)
plt.show() if __name__ == '__main__':
print('rustfisher 图表讲解')
demo2()

运行得到

红色框框里的是figure;绿色框框里的叫做ax。

代码中ax = plt.gca()获取到的就是绿色框框里的部分(对象)。

Figure 大图

Figure代表整张图,暂时称为“全图”或者“大图”。一张图里可以有多个子图表。最少必须要有一个图表。像上面那样。

Axes 数据图

一张张的图,图里显示着数据,暂称为“数据图”。一个大图里可以有多个数据图。但单个数据图对象只能在1个大图里。

多张数据图 subplots

例如同时存在2个数据图

def demo_subplot():
x_list = []
y_list = []
y2_list = []
for i in range(0, 365):
x_list.append(i)
y_list.append(math.sin(i * 0.1))
y2_list.append(math.cos(i * 0.1))
fig, (ax1, ax2) = plt.subplots(2)
ax1.set_title('rustfisher.com 1')
ax2.set_title('rustfisher.com 2')
ax1.set_xlabel('x')
ax1.set_ylabel('y = sin(x)')
ax2.set_xlabel('x')
ax2.set_ylabel('y = cos(x)')
ax1.plot(x_list, y_list)
ax2.plot(x_list, y2_list)
plt.show()

调用subplots()接口,传入数字指定要多少张数据图。

返回的多张图要用括号括起来。每个数据图可以绘制(plot)不同的数据。

标题用set_title()来设置。

可以看到上下两张图太挤了,有重叠部分。可以在plt.show()之前加一个fig.tight_layout()让它们拉开一点距离。

坐标轴

对于2维数据图,它有2个坐标,横坐标和纵坐标。有一些接口可以设置参数。

例如控制坐标轴的名字set_xlabel() set_ylabel

显示数据范围

set_xlim方法可以控制x轴数据显示范围。同理y轴用set_ylim来控制。

对于显示范围,set_xlim方法主要参数为leftright;或者用xmin xmax。这两套不能同时使用。

set_ylim主要参数是top bottom;或者ymin ymax。这两套不能同时使用。

增加显示范围控制的代码

def demo3():
x_list = []
y_list = []
y2_list = []
for i in range(0, 365):
x_list.append(i)
y_list.append(math.sin(i * 0.1))
y2_list.append(math.cos(i * 0.1))
fig, (ax1, ax2) = plt.subplots(2)
ax1.set_title('rustfisher.com 1')
ax1.set_xlabel('x')
ax1.set_ylabel('y = sin(x)')
ax2.set_title('rustfisher.com 2')
ax2.set_xlabel('x')
ax2.set_ylabel('y = cos(x)') ax1.set_xlim(left=50, right=200.6) # 控制x轴显示范围
ax1.set_ylim(top=1, bottom=0.3) # 控制y轴显示范围 ax2.set_xlim(xmin=1, xmax=156.6) # 控制x轴显示范围
ax2.set_ylim(ymin=-0.3, ymax=0.3) # 控制y轴显示范围 ax1.plot(x_list, y_list)
ax2.plot(x_list, y2_list)
fig.tight_layout()
plt.show()

运行结果

刻度

tick意思是标记。在坐标轴上的是刻度。Major tick暂称为大刻度,minor tick暂称为小刻度。

使用set_xticks方法控制刻度显示。传入的列表是我们希望显示的刻度。

minor参数默认为False,不显示小刻度。

关键代码如下

ax1.set_xticks([50, 60, 70, 150])
ax1.set_yticks([0.1, 0.2, 0.3, 0.7, 0.9])
ax1.grid() # 显示格子 ax2.set_xticks([1, 60, 70, 150], minor=True)
ax2.set_yticks([-0.1, 0, 0.1, 0.3], minor=True)
ax2.grid()

可见当minor=True,传入的刻度列表有可能不显示。

也可以控制大刻度上的文字旋转

    plt.setp(ax1.xaxis.get_majorticklabels(), rotation=-45)
plt.setp(ax2.xaxis.get_majorticklabels(), rotation=-60)

边线 spine

spine是脊柱的意思,这里我们先称为边线。有上下左右4条边线。名称是top bottom left right

可以直接从图表对象获取它的边线,比如右边线ax1.spines.right

一些简单的操作,例如

  • set_visible 显示和隐藏
  • set_ticks_position 刻度显示的位置
  • set_bounds 边线显示范围
  • set_linewidth 线的宽度

隐藏右边线和上边线

ax1.spines.right.set_visible(False)
ax1.spines.top.set_visible(False)

让刻度显示在右边和上方

ax2.yaxis.set_ticks_position('right')
ax2.xaxis.set_ticks_position('top')

设置边线显示范围

ax3.spines.left.set_bounds(-0.5, 0.5)
ax3.spines.top.set_bounds(340, 400)

设置线的宽度

ax3.spines.bottom.set_linewidth(2)

完整代码如下

import math
import matplotlib.pyplot as plt def demo_spine():
x_list = []
y_list = []
for i in range(0, 365):
x_list.append(i)
y_list.append(math.sin(i * 0.1)) fig, (ax1, ax2, ax3) = plt.subplots(3)
ax_list = [ax1, ax2, ax3]
for i in range(0, 3):
cur_ax = ax_list[i]
cur_ax.set_title('rustfisher.com ' + str(i))
cur_ax.plot(x_list, y_list)
cur_ax.set_xlabel('x')
cur_ax.set_ylabel('y = sin(x)') ax1.spines.right.set_visible(False)
ax1.spines.top.set_visible(False) ax2.spines.bottom.set_visible(False)
ax2.spines.left.set_visible(False)
ax2.yaxis.set_ticks_position('right')
ax2.xaxis.set_ticks_position('top') ax3.spines.left.set_bounds(-0.5, 0.5)
ax3.spines.top.set_bounds(340, 400)
ax3.spines.bottom.set_linewidth(2) fig.tight_layout()
plt.show()

运行截图

数据点

控制数据点的样式。下面我们在一张图表里绘制多条数据线。

def demo_line():
x_list = []
y_list = []
y2_list = []
y3_list = []
for i in range(0, 20):
x_list.append(i)
y_list.append(math.sin(i) * 2 - 4)
y2_list.append(math.sin(i) * 2)
y3_list.append(math.cos(i) * 1.3 + 3) plt.plot(x_list, y_list, color='blue', linestyle='-.', linewidth=2, markersize=4)
plt.plot(x_list, y2_list, 'go', linewidth=1)
plt.plot(x_list, y3_list, 'r+')
plt.show()

plot()方法中,支持多种选项。

linestyle支持的选项

'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'

注释 legend

添加注释,调用lengend()方法。

在前面代码基础上添加

    plt.plot(x_list, y_list, color='blue', linestyle='-.', linewidth=2, markersize=4)
plt.plot(x_list, y2_list, 'go', linewidth=1)
plt.plot(x_list, y3_list, 'r+')
plt.legend(['math.sin(i) * 2 - 4', 'math.sin(i) * 2', 'math.cos(i) * 1.3 + 3'])

控制注释显示的地方,添加bbox_to_anchorbbox_transform属性

plt.legend(['math.sin(i) * 2 - 4', 'math.sin(i) * 2', 'math.cos(i) * 1.3 + 3'], bbox_to_anchor=(1, 1),
bbox_transform=plt.gcf().transFigure)

中文乱码问题

在设置标题用到中文的时候,可能会出现乱码。

可以设置rcParams的字体,解决乱码问题。

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

至此,我们把图表中各个部分都简要介绍了一下。

参考

本例环境

  • macOS
  • PyCharm CE
  • Python3

参考资料

Python图表库Matplotlib 组成部分介绍的更多相关文章

  1. python标准库之glob介绍

    python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...

  2. Python第三方库matplotlib(2D绘图库)入门与进阶

    Matplotlib 一 简介: 二 相关文档: 三 入门与进阶案例 1- 简单图形绘制 2- figure的简单使用 3- 设置坐标轴 4- 设置legend图例 5- 添加注解和绘制点以及在图形上 ...

  3. Python可视化库-Matplotlib使用总结

    在做完数据分析后,有时候需要将分析结果一目了然地展示出来,此时便离不开Python可视化工具,Matplotlib是Python中的一个2D绘图工具,是另外一个绘图工具seaborn的基础包 先总结下 ...

  4. python第三方库requests简单介绍

    一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...

  5. Python标准库:1. 介绍

    标准库包括了几种不同类型的库. 首先是那些核心语言的数据类型库,比方数字和列表相关的库.在核心语言手冊里仅仅是描写叙述数字和列表的编写方式,以及它的排列,而未定义它的语义. 换一句话说,核心语言手冊仅 ...

  6. Python可视化库Matplotlib的使用

    一.导入数据 import pandas as pd unrate = pd.read_csv('unrate.csv') unrate['DATE'] = pd.to_datetime(unrate ...

  7. python可视化库 Matplotlib 01 figure的详细用法

    1.上一章绘制一幅最简单的图像,这一章介绍figure的详细用法,figure用于生成图像窗口的方法,并可以设置一些参数 2.先看此次生成的图像: 3.代码(代码中有详细的注释) # -*- enco ...

  8. Python图表绘制Matplotlib

    引入 import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 导入相关模块 使用 # 图表窗口1 → plt.sho ...

  9. Python NLP库top6的介绍和比较

    文章来源:ActiveWizards https://medium.com/activewizards-machine-learning-company/comparison-of-top-6-pyt ...

随机推荐

  1. CentOS 7 部署 node 项目

    CentOS 7 部署 node 项目 安装 node 环境 方法一:使用 wget 的方式下载压缩包进行解压 淘宝node镜像地址,进入地址选择自己想要安装的版本 wget https://npm. ...

  2. Node.js使用本地依赖

    最近项目组写了几个模块,打算采用依赖的方式来使用它们. 因为敏感性问题,不打算发布到npm官方仓库:自行搭建一个npm仓库成本也大. 所以最后决定采用本地安装. 即在package.json中填写如下 ...

  3. What is maven?

    Introduction Maven, a Yiddish word meaning accumulator(累加器) of knowledge, began as an attempt to sim ...

  4. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

  5. 记一次项目中解决 -- 并发减库存超卖问题过程(Java)

    起因:项目中要做预约功能,首先每天的余票都是有上限的,自然不能出现超卖的情况 基于我们项目是单体分布式的springcloud部署,我想了下 第一种方法,直接mysql加行锁,要update这条库存数 ...

  6. java处理方法的多个返回值

    我第一次接触到元组是在java编程思想这本书中,当时我正为方法的多个返回值苦恼.因为我之前处理多个返回值方法的时候,要不建一个新的实体类,要不在接收的方法中建立一个对象,返回值之前给其赋值,要不通过异 ...

  7. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...

  8. 【题解】Luogu p2014 选课 树型dp

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  9. xshell远程连接另一台电脑的数据库,启动图形失败

    1.用xshell远程连接数据库10.62.207.152,且用oracle用户直接登陆 2.执行:netca 报错: Oracle Null Service Configuration: Error ...

  10. ES6中的Generator函数

    今天小编发现一个es6中的新概念,同时也接触到了一个新关键字yeild,下面我就简单和大家聊聊es6中的generator函数.大家还可以关注我的微信公众号,蜗牛全栈. 一.函数声明:在functio ...