在 Python 中的 Matplotlib 图像背景上绘制图表
在 Python 的 Matplotlib 库中,我们经常使用 plot() 函数来绘制图表。但是在某些情况下,我们需要在如图像、视频等背景上进行绘制。本文将介绍在 Matplotlib 中如何实现在图像背景上绘制图表。
在图像背景上绘制图表的基本原理
Matplotlib 中的 plot() 函数绘图时,会创建一个新窗口或绘制到 Jupyter Notebook 等代码编辑器的输出格中。而如果我们要在图像背景上绘制,则需要先将背景载入为 numpy 数组,并使用 imshow() 函数将图像显示出来,然后再使用 scatter()、plot() 等函数绘制图表。
实现这一过程的代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 载入背景图像并转为 numpy 数组
background = plt.imread("background.png")
# 显示背景图像
plt.imshow(background)
# 绘制散点图
X = np.random.normal(0, 1, 100)
Y = np.random.normal(0, 1, 100)
plt.scatter(X, Y)
# 显示图表
plt.show()
值得注意的是,载入的图像文件需要与代码文件存在于同一目录中,并将文件名以字符串格式作为参数传入 imread() 函数中。
实战:在宇宙背景上绘制星空
接下来,我们将以宇宙背景为例,在其上绘制星空图表。首先,我们需要下载一张高清晰度的宇宙图像,并将其转为 numpy 数组。
import urllib.request
import numpy as np
# 下载宇宙背景图像
url = "https://apod.nasa.gov/apod/image/1901/OrionTrapezium_BOTH_3000px_v2.jpg"
urllib.request.urlretrieve(url, "universe.jpg")
# 载入背景图像并转为 numpy 数组
background = plt.imread("universe.jpg")
接着,我们使用 imshow() 函数显示宇宙背景,并使用 scatter() 函数绘制星空。为了视觉效果,我们将星空的点大小增加到了 30,并在颜色上进行了随机。
import numpy as np
import matplotlib.pyplot as plt
# 载入背景图像并转为 numpy 数组
background = plt.imread("universe.jpg")
# 显示背景图像
plt.imshow(background)
# 绘制星空点集
X = np.random.rand(1000) * 3000
Y = np.random.rand(1000) * 2000
colors = np.random.rand(1000, 3)
plt.scatter(X, Y, s=30, c=colors)
# 隐藏坐标轴并显示图表
plt.axis("off")
plt.show()
最后,我们将绘制得到的图像保存下来,以便后续使用。
# 保存图像
plt.savefig("universe_with_stars.png")
结论
在 Matplotlib 中,通过载入 numpy 数组作为背景,我们可以在图像、视频等背景上绘制图表。当我们想要在视觉效果上进行创新,或者将图表与自然界的背景有机地结合在一起时,这一技巧无疑将非常有用。