Python-Matplotlib可视化(7)——多方面自定义统计图绘制

  • 前言
  • 多个子图的合成
    • 为每个子图添加标题
    • 子图合成的另一种方法
    • 更简洁的方法
  • 等比例缩放坐标轴
  • 设置坐标轴范围
  • 设置图形比例
  • 插入子图
  • 系列链接

前言

在系列博文的中,我们已经学习了如何自定义绘图的颜色和样式,以使得绘制更加精美、符合审美要求。可以用Matplotlib绘制出复杂而又精美的统计图,同时也讲解了注释的用法,使统计图变得清晰简洁。但这些仅仅是Matplotlib绘图包强大功能的冰山一角。
当我们使用一个绘图包时,我们需要其涵盖的内容极其多样:一方面,我们希望可以使用最少的代码和技巧创建任何类型的图形;另一方面,我们也希望能够灵活的自定义图形的所有方面。这是两个截然相反的目标,Matplotlib在这两个目标之间提供了优异的平衡。接下来,我们将看到如何在多个方面自定义图形。

多个子图的合成

有时,我们希望检查数据的多个方面。例如,查看一个地区的天气状况,我们不仅希望得到时间与温度的关系,同时我们也需要关注时间与风力、PM2.5等方面之间的关系,此时我们希望同时展现时间-温度、时间-风力、时间-PM2.5三个不同的图形,Matplotlib提供了将多个图形组合在一起的方法。

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(-np.pi, np.pi, 1024)
grid_size = (4, 2)
plt.subplot2grid(grid_size, (0, 0), rowspan = 3, colspan = 1)
plt.plot(np.sin(2 * t), np.cos(0.5 * t), c = 'm')
plt.subplot2grid(grid_size, (0, 1), rowspan = 3, colspan = 1)
plt.plot(np.cos(3 * t), np.sin(t), c = 'c')
plt.subplot2grid(grid_size, (3, 0), rowspan=1, colspan=3)
plt.plot(np.cos(5 * t), np.sin(7 * t), c= 'y')
plt.tight_layout()
plt.show()

Tips:使用plt.subplot2grid()可以定义一个R行、C列的网格。然后,我们可以将一个图形渲染到所定义的网格中。
plt.subplot2grid()函数有四个常用参数:

  1. 第一个参数是网格的行数和列数,作为元组传递,例如我们想要一个R行、C列的网格,则需要传递(R,C)。
  2. 第二个参数用于确定图形在网格中的坐标,也作为元组传递。
  3. 可选参数rowspan定义图形将占据多少行。
  4. 可选参数colspan定义图形将占据多少列。

调用plt.subplot2grid()后,对plt绘图的下一次调用将在指定的矩形区域内绘制图形,同理,要在网格的另一个区域中绘制下一个图形,需要再次调用plt.subplot2grid()
在示例中,定义了一个2x4的网格。前两个图形占据了1列、3行,第三个图形占据了两列、一行。一旦绘制了所有的图形,就需要调用pyplot.tight_layout()按照定义自动排列所有图形,确保它们彼此不重叠。

为每个子图添加标题

我们已经可以将多个子图合成在一个图形中,但是每个子图可能还需要有自己的标题,可以使用plt.title()为每个子图添加标题:

import numpy as np
from matplotlib import pyplot as plt
def get_radius(t, params):m, n_1, n_2, n_3 = paramsu = (m * t) / 4return (np.fabs(np.cos(u)) ** n_2 + np.fabs(np.sin(u)) ** n_3) ** (-1. / n_1)
grid_size = (3, 4)
t = np.linspace(0, 2 * np.pi, 1024)
for i in range(grid_size[0]):for j in range(grid_size[1]):params = np.random.randint(1, 20+1, size = 4)r = get_radius(t, params)plt.subplot2grid(grid_size, (i, j), rowspan=1, colspan=1)plt.plot(r * np.cos(t), r * np.sin(t), c = 'c')plt.title('%d, %d, %d, %d' % tuple(params), fontsize = 'small')
plt.suptitle("Example of plt.suptitle")
plt.tight_layout()
plt.show()

Tips:plt.title()函数可以为每一个图形提供一个标题,但此时,如果我们需要为整个图形提供一个标题,则应该使用plt.suptitle()函数。

子图合成的另一种方法

上述的子图合成方法具有通用性,可以使用它创建复杂的布局,但如果我们只需要在同一行或同一列中绘制多个子图,则可以使用更简洁的代码:

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(-np.pi, np.pi, 1024)
fig, (ax0, ax1, ax2) = plt.subplots(ncols =3)
ax0.plot(np.sin(2 * t), np.cos(0.5 * t), c = 'c')
ax1.plot(np.cos(3 * t), np.sin(t), c = 'c')
ax2.plot(np.cos(3 * t), np.sin(2 * t), c = 'c')
plt.tight_layout()
plt.show()

Tips:plt.subplots()函数接受两个可选参数ncols和nrows,并返回一个带有ncols*nrows轴实例的Figure对象。轴实例按nrows行、ncols列排列在网格中。

更简洁的方法

虽然上述两种方法都可以实现合成子图的应用需求,但是我们需要的远不止此,我们可能想要更简洁的方法,而plt.subplot()函数就是我们所需要的。

import numpy as np
from matplotlib import pyplot as plt
def get_radius(t, params):m, n_1, n_2, n_3 = paramsu = (m * t) / 4return (np.fabs(np.cos(u)) ** n_2 + np.fabs(np.sin(u)) ** n_3) ** (-1. / n_1)
grid_size = (3, 4)
t = np.linspace(0, 2 * np.pi, 1024)
for i in range(grid_size[0] * grid_size[1]):params = np.random.random_integers(1, 20, size = 4)r = get_radius(t, params)plt.subplot(grid_size[0], grid_size[1], i+1)plt.plot(r * np.cos(t), r * np.sin(t), c = 'c')plt.title('%d, %d, %d, %d' % tuple(params), fontsize = 'small')
plt.suptitle("Example of plt.suptitle")
plt.tight_layout()
plt.show()

Tips:plt.subplot()函数接收三个参数,分别为行数,列数,以及子图的位序,直接指定划分网格的方式和需要绘图的位置索引。

等比例缩放坐标轴

默认情况下,Matplotlib对图形的两个轴使用不同的比例,在系列教程学会Python-Matplotlib可视化,快速完成数据分析(5)——自定义坐标轴让统计图清晰易懂中,我们已经看到可以使用plt.axis('scaled')来使坐标轴具有相同比例,这里我们介绍另外一种方法,通过Axes对象修改坐标轴比例。

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.axes().set_aspect('equal')
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.show()

等效于:

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.axis('scaled')
plt.show()

可以看到我们绘制的椭圆,其中长轴的长度是短轴的两倍,而通过修改坐标轴的比例,Matplotlib渲染的椭圆也具有相同的比例。
Tips:plt.axes()函数返回Axes对象的一个实例,Axes实例有一个set_aspect方法,将其设置为"equal"则两个轴使用相同的比例。
如果我们不进行此设置,则所绘制的椭圆则如下图所示,看起来长轴的长度并非短轴的两倍。

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.show()

设置坐标轴范围

默认情况下,Matplotlib会在两个坐标轴方向上查找数据的最小值和最大值,并进行适当的扩展,用作绘制数据的范围。但是,有时需要手动设置图形的坐标轴范围,以便更好地查看数据的极值。

import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-6, 6, 1024)
plt.ylim(-.5, 1.5)
plt.plot(x, np.sinc(x), c = 'c')
plt.show()

Tips:plt.xlim()和plt.ylim()分别用于控制x轴和y轴的范围,其接受参数用于设置坐标轴范围的最大值和最小值。

设置图形比例

当我们需要将图形用于期刊出版物或网站时,可能需要具有特定纵横比的图形。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 1000)
y_1, y_2 = np.sinc(x), np.cos(x)
plt.figure(figsize=(10.24, 2.56))
plt.plot(x, y_1, c='c', lw = 1.25)
plt.plot(x, y_2, c='m', lw = 1.25)
plt.show()

Tips:plt.figure()函数用于创建一个新的Figure实例,一个Figure对象表示一个图形整体。通常,此对象是在隐式创建的。但是,通过显式地创建Figure对象,我们可以控制图形的各个方面,其中figsize参数允许我们指定Figure对象大小。

插入子图

在一个图形中嵌入的小图形有助于显示图形的细节,或者也可以说,有助于强调图形的特定部分。与使用多个子图进行的合成有所不同,这种插入子图,其子图是图形的一部分,而多个子图进行的合成中,子图间是彼此独立的,抽象的讲解太过复杂,看一个示例就能一目了然了。

import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-6, 6, 1024)
y = np.sinc(x)
x_detail = np.linspace(-2, 2, 1024)
y_detail = np.sinc(x_detail)
plt.plot(x, y, c = 'c')
sub_axes = plt.axes([.6, .6, .25, .25])
sub_axes.plot(x_detail, y_detail, c = 'm')
plt.setp(sub_axes)
plt.show()

为了插入子图,我们首先在图上创建一个子区域:

sub_axes = plt.axes([.6, .6, .25, .25])

在图形坐标的表示中:(0, 0)是整个图形的左下角,(1, 1)是右上角,子区域由四个值定义——区域左下角的坐标及其尺寸。
一旦定义了子区域,我们就有了一个Axes实例,然后就可以在其中绘制所需图形。最后,我们需要在Axes实例上调用plt.setp()显示子图:

plt.setp(sub_axes)

Tips:可以创建的子图数量并没有限制。

系列链接

Python-Matplotlib可视化(1)——一文详解常见统计图的绘制
Python-Matplotlib可视化(2)——自定义颜色绘制精美统计图
Python-Matplotlib可视化(3)——自定义样式绘制精美统计图
Python-Matplotlib可视化(4)——添加注释让统计图通俗易懂
Python-Matplotlib可视化(5)——添加自定义形状绘制复杂图形
Python-Matplotlib可视化(6)——自定义坐标轴让统计图清晰易懂
Python-Matplotlib可视化(8)——图形的输出与保存
Python-Matplotlib可视化(9)——精通更多实用图形的绘制
Python-Matplotlib可视化(10)——一文详解3D统计图的绘制

Python-Matplotlib可视化(7)——多方面自定义统计图绘制相关推荐

  1. python使用matplotlib可视化subplots子图、subplots绘制子图、子图之间有重叠问题、使用subplots_adjust函数合理设置子图之间的水平和垂直距离

    python使用matplotlib可视化subplots子图.subplots绘制子图.子图之间有重叠问题.使用subplots_adjust函数合理设置子图之间的水平和垂直距离(vertical/ ...

  2. Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)

    Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式).使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等) 目 ...

  3. Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签、用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部)

    Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签.用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部) ...

  4. Python matplotlib可视化:用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的外侧顶部)

    Python matplotlib可视化:用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的外侧顶部) 目录

  5. Python matplotlib可视化:在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)、水平条形图(horizontal bar)

    Python matplotlib可视化:在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等).水平条形图(horizontal bar) 目录

  6. Python+matplotlib可视化自定义轴域大小和位置

    推荐图书: <Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷 图书详情(京东): 董付国老师17本Python系列图书均提供配套教学资源 ...

  7. Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数

    开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...

  8. python Matplotlib 可视化总结归纳(二) 绘制多个图像单独显示多个函数绘制于一张图

    1. 绘制多个图像单独显示(subplot) import numpy as np import matplotlib.pyplot as plt #创建自变量数组 x= np.linspace(0, ...

  9. Python+matplotlib可视化设置图例位于柱状图下方

    推荐教材: <Python数据分析.挖掘与可视化>(慕课版)(ISBN:978-7-115-52361-7),董付国,人民邮电出版社,定价49.8元,2020年1月出版,2021年3月第6 ...

最新文章

  1. Fedora换源:换成aliyun镜像源
  2. Cisco 2900 series添加VWIC2-1MFT-G703板卡
  3. erp故障处理流程图_博科Yigo-ERP讲堂 | 您的企业需要实施工厂维护模块吗?
  4. Labview 做二维码识别
  5. linux更新war包操作步骤,关于Linux系统下基于Tomcat部署和升级war包的详细过程
  6. boost vs loki 分类的第一篇文章,我的boost,loki体验
  7. php手机网页下载文件,php 手机下载 POST 类
  8. 编写一递归函数求斐波纳契数列1,1,2,3,5,8,13,…的前40项。c语言
  9. Docker进入/退出容器命令
  10. U盘文件如何恢复?u盘还原,必学的4招(2023已更新)
  11. 学习笔记:《机器人SLAM导航核心技术与实战》序言
  12. JAVA扫雷小游戏(待改进)
  13. 什么牌子的千兆网卡好用_不挑次的只挑好的 台式机千兆网卡应该买哪些?
  14. Doris最全使用手册
  15. 个性化实时音乐推荐系统-毕业设计
  16. 恒虚警率(CFAR)检测 MATLAB官网资料学习记录
  17. 智能手术机器人起源及应用(一)
  18. 【资源搜集】ProcessExplorer 帮你彻底干掉电脑里烦人的广告弹窗
  19. 《Imaging Systems For Medical Diagnostics》——11. Image Displays
  20. html生成word页眉图片,js客户端页面导出成word,并可以设置页眉页脚

热门文章

  1. 使用Masonry让cell高度自适
  2. 子类调用父类的构造函数几种情况
  3. spring加载jar包中多个配置文件
  4. 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)
  5. 【转】Android 中的 Service 全面总结
  6. [转载] c++ iterator 失效_C++ STL迭代器失效问题
  7. Element-ui框架Tree树形控件切换高亮显示选中效果
  8. C#使用NPOI导出excel设置单元格背景颜色
  9. 【APIO2015】Bali Sculptures
  10. 头条号【编编成程】开通