Python进阶之Matplotlib入门(五)

小编 2026-06-18 阅读:1829 评论:0
引言Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。前面课程:Pyt...

引言

Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。

前面课程:

Python进阶之Matplotlib入门(一)

Python进阶之Matplotlib入门(二)

Python进阶之Matplotlib入门(三)

Python进阶之Matplotlib入门(四)

概要

1、掌握Matplotlib中的标注函数annotate;

2、掌握Matplotlib中的添加文本函数text;

3、掌握Matplotlib中的改变能见度函数set_bbox。

标注

有时候,我们希望给图上的一些点或者线做一些更加精细的标注,达到美观和细化图片的效果,比如这样的:

这里我们给sin函数标注了在2/3pi时候的值,要想做到这一点我们分两步走:

  1. 画一条红色虚线以及红色实心点
  2. 用annotate函数进行文字标注
t = 2*np.pi/3
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 50, color ='red')

plt.annotate(r'$sin(frac{2pi}{3})=frac{sqrt{3}}{2}$',
         xy=(t, np.sin(t)), xycoords='data',
         xytext=(+10, +30), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

其中第一步,我们用到了两种画图函数,分别是plot以及scatter。plot函数的操作我们其实经过前面的学习已经能够完全掌握,包括设置颜色,线宽和线风格。而画红色实心点的函数scatter我们是第一次见,关于这个函数我们将会在后面详细介绍。

第二步我们用了一段关于annotate很长的代码,其中:

  • r''里面的内容就是文字部分,熟悉Latex的同学可能对这部分内容非常熟悉,它是负责显示公式,由$$符号来引导。具体如何用latex打印公式需要大家自己去学习了。参数xy=(t, np.sin(t))表明注释的位置
  • 参数xycoords='data' 是说基于数据的值来选位置, xytext=(+10,+30)对于标注相对位置的描述 和 xy 偏差值,arrowprops是对图中箭头类型的一些设置.

完整版代码:

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
x = np.linspace(-np.pi, np.pi, 256)
y1,y2 = np.cos(x), np.sin(x)
plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="cosine")
plt.plot(x, y2, color="green", linewidth=1.0, linestyle="--", label="sine")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
       [r'$-pi$', r'$-pi/2$', r'$0$', r'$+pi/2$', r'$+pi$'])

plt.yticks([-1, 0, +1],
       [r'$-1$', r'$0$', r'$+1$'])

ax = plt.gca()
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

plt.legend(loc='upper left')

t = 2*np.pi/3
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 50, color ='red')

plt.annotate(r'$sin(frac{2pi}{3})=frac{sqrt{3}}{2}$',
         xy=(t, np.sin(t)), xycoords='data',
         xytext=(+10, +30), textcoords='offset points', fontsize=16,
         arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

plt.show()

添加文字

除了上面讲到的用annotate函数来给图片标注,我们也可以有另一种方式来添加文字,这个函数叫做text。我们直接用一个例子来说明:

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
x = np.linspace(-np.pi, np.pi, 256)
y1,y2 = np.cos(x), np.sin(x)
plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="cosine")
plt.plot(x, y2, color="green", linewidth=1.0, linestyle="--", label="sine")

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
       [r'$-pi$', r'$-pi/2$', r'$0$', r'$+pi/2$', r'$+pi$'])

plt.yticks([-1, 0, +1],
       [r'$-1$', r'$0$', r'$+1$'])

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

plt.legend(loc='upper left')

plt.text(-2.0, 1.2, r'Plot of sin(x) and cos(x).',
         fontdict={'size': 16, 'color': 'r'})

plt.show()

其中,r' '里面是文字内容,而fontdict负责设置文字的大小以及颜色等。

运行结果:

可以看到图中的红色文字部分成功加入。

能见度

我们经常会遇到画出来的线和坐标轴有重合的地方,比如这个图:

不管是蓝色实线还是绿色虚线都有和坐标轴刻度标记文字有重合部分,为了解决这个问题,我们使用 label.set_bbox来设置透明度:

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
x = np.linspace(-np.pi, np.pi, 256)
y1,y2 = np.cos(x), np.sin(x)
plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="cosine", zorder=1)
plt.plot(x, y2, color="green", linewidth=1.0, linestyle="--", label="sine", zorder=1)

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
       [r'$-pi$', r'$-pi/2$', r'$0$', r'$+pi/2$', r'$+pi$'])

plt.yticks([-1, 0, +1],
       [r'$-1$', r'$0$', r'$+1$'])

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

plt.legend(loc='upper left')

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.7, zorder =2 ))

plt.show()

注意到我们画sin以及cos函数的时候,加入了一个参数zorder = 1,这是为了后面在坐标轴刻度颜色以及能见度的时候可以覆盖sin以及cos函数线。

负责调控能见的核心代码:

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.7, zorder =2 ))

其中set_fontsize是设置刻度标注的字体大小,而set_bbox就是设置坐标刻度标注周围一个方块范围内颜色以及能见度,其中alpha负责能见度,zorder=2是呼应前面的zorder=1,让更高级别的设置可以覆盖更低级别的设置。

运行结果:

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表