当前位置:首页>python>Python | Matplotlib图表设计

Python | Matplotlib图表设计

  • 2026-08-27 07:25:13
Python | Matplotlib图表设计

快速绘图

快速绘图

matplotlib中的快速绘图的函数库可以通过如下语句载入:

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(0, 10, 1000)

y = np.sin(x)

z = np.cos(x**2)

接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象:

plt.figure(figsize=(8,4))

plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:

plt.plot(x, y, label="$sin(x)$", color="red", linewidth=2)

plt.plot(x, z, "b--", label="$cos(x^2)$")

label:给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加''$''符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。

color:指定曲线的颜色

linewidth:指定曲线的宽度

"b--":指定曲线的颜色和线型

接下来通过一系列函数设置绘图对象的各个属性:

plt.xlabel("Time(s)")

plt.ylabel("Volt")

plt.title("PyPlot First Example")

plt.ylim(-1.2,1.2)

plt.legend()

xlabel / ylabel:设置X/Y轴的文字

title:设置图表的标题

ylim:设置Y轴的范围

legend:显示图示

最后调用plt.show()显示出创建的所有绘图对象。

还可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。

plt.savefig("test.png",dpi=120)

注意:如果show()先执行,则savefig() 不起作用

绘制多轴图

一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。可以使用subplot函数快速绘制有多个轴的图表:

subplot(numRows, numCols, plotNum)

按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1subplotplotNum(取值范围从到 numRows * numCols)指定的区域中创建一个轴对象。

如果需要同时绘制多幅图表,可以给figure()传递一个整数参数指定Figure对象的序号。

如果序号所指定的figure对象已经存在,将不创建新的对象,而只是让它成为当前的Figure对象。

import numpy as np

import matplotlib.pyplot as plt

plt.figure(1) #创建图表1

plt.figure(2) #创建图表2

#最后一个被创建或激活的图表是图表2,所以子图被创建在图表2中:

ax1 = plt.subplot(211) #在图表2中创建子图1

ax2 = plt.subplot(212) #在图表2中创建子图2

x = np.linspace(0, 3, 100)

for i in range(5):

plt.figure(1) # 选择图表1

plt.plot(x, np.exp(i*x/3))

#ax1ax2成为子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)

plt.sca(ax1) # 选择图表2的子图1

plt.plot(x, np.sin(i*x))

plt.sca(ax2) # 选择图表2的子图2

plt.plot(x, np.cos(i*x))

plt.show()

坐标轴设定(略)

Axis容器包括坐标轴的刻度线、刻度标签、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度。每个刻度线都是一个XTickYTick对象,它包括实际的刻度线和刻度标签。

获得刻度:get_major_ticks()get_minor_ticks()

获得刻度标签和刻度线:get_ticklabels()get_ticklines()

与刻度定位和文本格式化相关的类都在matplotlib.ticker模块中定义:

from matplotlib.ticker import MultipleLocator, FuncFormatter

放置主、副刻度线:set_major_locator()set_minor_locator()

绘图函数简介

对数坐标图

绘制对数坐标图的函数有三个:semilogx()semilogy()loglog(),它们分别绘制X轴为对数坐标、Y轴为对数坐标以及两个轴都为对数坐标时的图表。

import numpy as np

import matplotlib.pyplot as plt

w = np.linspace(0.1, 1000, 1000)

p = np.abs(1/(1+0.1j*w)) #计算低通滤波器的频率响应

plt.subplot(221)

plt.plot(w, p, linewidth=2)

plt.ylim(0,1.5)

plt.subplot(222)

plt.semilogx(w, p, linewidth=2)

plt.ylim(0,1.5)

plt.subplot(223)

plt.semilogy(w, p, linewidth=2)

plt.ylim(0,1.5)

plt.subplot(224)

plt.loglog(w, p, linewidth=2)

plt.ylim(0,1.5)

plt.show()

极坐标图

极坐标系是和笛卡尔(X-Y)坐标系完全不同的坐标系,极坐标系中的点由一个夹角和一段相对中心点的距离来表示。

import numpy as np

import matplotlib.pyplot as plt

theta = np.arange(0, 2*np.pi, 0.02)

plt.subplot(121, polar=True) #通过设polar参数为True创建极坐标子图

plt.plot(theta, 1.6*np.ones_like(theta), linewidth=2)

plt.plot(3*theta, theta/3, "--", linewidth=2)

plt.subplot(122, polar=True)

plt.plot(theta, 1.4*np.cos(5*theta), "--", linewidth=2)

plt.plot(theta, 1.8*np.cos(4*theta), linewidth=2)

plt.rgrids(np.arange(0.5, 2, 0.5), angle=45)

# rgrids()设置同心圆栅格的半径大小和文字标注的角度,因此右图中的虚线圆圈有三个,半径分别为0.51.01.5,这些文字沿着45°线排列

plt.thetagrids([0, 45])

# thetagrids()设置放射线栅格的角度,因此右图中只有两条放射线,角度分别为0°和45°

plt.show()

柱状图

data = np.loadtxt("china_population.txt")

width = (data[1,0] - data[0,0])*0.4

plt.figure(figsize=(8,5))

plt.rcParams['font.sans-serif']=['SimHei'] #绘图显示中文

plt.bar(data[:,0]-width, data[:,1]/1e7, width, color="b", label=u"")

plt.bar(data[:,0], data[:,2]/1e7, width, color="r", label=u"") 

plt.xlim(-width, 100)

plt.xlabel(u"年龄")

plt.ylabel(u"人口(千万)")

plt.legend()

plt.show()

散列图

使用plot()绘图时,如果指定样式参数为仅绘制数据点,那么所绘制的就是一幅散列图。

plt.plot(np.random.random(100), np.random.random(100), "o")

这种方法所绘制的点无法单独指定颜色和大小。

scatter()所绘制的散列图可以指定每个点的颜色和大小:

import numpy as np

import matplotlib.pyplot as plt

plt.figure(figsize=(8,4))

x = np.random.random(100)

y = np.random.random(100)

plt.scatter(x, y, s=x*1000, c=y, marker=(5, 1), alpha=0.8, lw=2, facecolors="none")

Øs:指定点的大小,它可以是一个数,指定所有点的大小;也可以是数组,分别对每个点指定大小。此处设置值和点的面积成正比。

Øc:指定点的颜色,可以是数值或数组。这里使用一维数组为每个点指定了一个数值(通过颜色映射表,每个数值都会与一个颜色相对应,默认的颜色映射表中蓝色与最小值对应,红色与最大值对应)。

Ømarker:设置点的形状,可以是表示形状的字符串;也可以是表示多边形的两个元素的元组:第一个元素表示多边形的边数,第二个元素表示多边形的样式,取值0表示多边形,1表示星形,2表示放射形,3表示圆形。

Øalpha:点的透明度。

Ølw:线宽(line width)。

Øfacecolors:“none”表示散列点没有填充色。

plt.xlim(0,1)

plt.ylim(0,1)

plt.show()

注:此处使用的版本似乎不符合对c和 facecolors 的描述

图像(略)

imread()可以从图像文件读入数据,得到一个表示图像的NumPy数组。它的第一个参数是文件名或文件对象,format参数指定图像类型,如果省略,就由文件的扩展名决定图像类型。对于灰度图像,它返回一个形状为(MN)的数组;对于彩色图像,返冋形状为(MNC)的数组。其中,M为图像的高度,N为图像的宽度,C34,表示图像的通道数。

imshow()可以用来显示imread()返回的数组。从JPG图像中读入的数据是上下颠倒的,为了正常显示图像,可以将数组的第0轴反转,或者设置imshow()origin参数为“lower”:

plt.imshow(img[::-1]) #反转图像数组的第0

plt.imshow(img, origin="lower") #让图表的原点在左下角

等值线图(略)

所谓等值线,是指由函数值相等的各点连成的平滑曲线。等值线可以直观地表示二元函数值的变化趋势,例如等值线密集的地方表示函数值在此处的变化较大。

matplotlib中可以使用contour()contourf()描绘等值线,它们的区别是:contourf()所得到的是带填充效果的等值线。

import numpy as np

import matplotlib.pyplot as plt

y, x = np.ogrid[-2:2:200j, -3:3:300j]

z = x * np.exp( - x**2 - y**2)

extent = [np.min(x), np.max(x), np.min(y), np.max(y)]

plt.figure(figsize=(10,4))

plt.subplot(121)

cs = plt.contour(z, 10, extent=extent) 

plt.clabel(cs)

plt.subplot(122)

plt.contourf(x.reshape(-1), y.reshape(-1), z, 20) 

plt.show()

三维绘图(略)

mpl_toolkits.mplot3d模块在matplotlib基础上提供了三维绘图的功能。由于它使用matplotlib的二维绘图功能来实现三维图形的绘制工作,因此绘图速度有限,不适合用于大规模数据的三维绘图。如果需要更复杂的三维数据可视化功能,可使用Mayavi

import numpy as np

import mpl_toolkits.mplot3d

import matplotlib.pyplot as plt

x, y = np.mgrid[-2:2:20j, -2:2:20j]

z = x * np.exp( - x**2 - y**2)

ax = plt.subplot(111, projection='3d') # projection='3d'指定使用三维投影

ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap = plt.cm.Blues_r)

rstride:行方向的步长(每隔2行采样一次)

cstride:列方向的步长(每隔1列采样一次)

cmap=plt.cm.Blues_r:指定颜色映射为反向蓝白渐变(Blues_r

ax.set_xlabel("X")

ax.set_ylabel("Y")

ax.set_zlabel("Z")

plt.show()

最新文章

随机文章