专栏首页浊酒清味Python进阶之Matplotlib入门(五)

Python进阶之Matplotlib入门(五)

引言

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{2\pi}{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{2\pi}{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,让更高级别的设置可以覆盖更低级别的设置。

运行结果:

本文分享自微信公众号 - Python与机器学习之路(gh_39aead19f756),作者:Huangwei AI

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python进阶之Matplotlib入门(四)

    Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

    HuangWeiAI
  • 手把手教你使用PCA进行数据降维

    对数据降维可以帮助我们提取数据集的主要信息,即将原始的高维特征空间压缩到低纬度的特征子空间。数据降维是用于提高计算效率的典型手段,另一个好处是也能够减小维度诅咒...

    HuangWeiAI
  • Python快速入门(六)

    Python作为一个,目前最火的编程语言之一,已经渗透到了各行各业。它易学好懂,拥有着丰富的库,功能齐全。人生苦短,就用Python。

    HuangWeiAI
  • 悬赏百万美金,检测Deepfake假视频,数据集有470G:很久不见这么壕的比赛

    这是Facebook联合亚马逊、微软、“AI伙伴关系”以及各路学者,一同举办的比赛。

    量子位
  • 计算机视觉101:使用Python处理彩色图像

    每个计算机视觉项目(无论是猫/狗分类器还是为旧图像/电影添加颜色)都涉及处理图像。最后,模型只能与基础数据一样好- 垃圾回收。这就是为什么在这篇文章中,着重于解...

    代码医生工作室
  • ClickHouse分布式高可用集群搭建

    地址:https://packagecloud.io/altinity/clickhouse

    用户1338460
  • x轴坐标斜着显示set_xticklabels(tt.index,rotation=45)

    用户1733462
  • numpy: np.ndarray.flatten

    Args: 顺序:{‘C’,’F’,’A’,’K’},可选。 “C” 意思是以行大(C形)的顺序变平。 “F” 表示按列主要(Fortran风格)...

    Petrichor_
  • 变量

    为什么不是xujie呢?因为flag.String()返回的是值的地址,那么我们怎么才能取到地址的值呢?

    酷走天涯
  • Python使用pyopencl在GPU上并行处理批量判断素数

    扩展库pyopencl使得可以在Python中调用OpenCL的并行计算API。OpenCL(Open Computing Language)是跨平台的并行编程...

    Python小屋屋主

扫码关注云+社区

领取腾讯云代金券