Python Matplotlib绘图基础与进阶实战:从线性图到子图布局
本文详解Python中Matplotlib库的核心绘图功能。内容涵盖线性方程绘制、多窗口与单窗口多曲线展示、线条样式与坐标轴定制。进一步介绍散点图、带数值标注的柱状图、等高线图及图例设置。最后深入讲解子图创建、网格布局及复杂排版技巧,提供PyCharm环境下的完整代码示例。
开发环境差异说明
在开始具体代码示例前,首先需要明确开发环境的差异。Jupyter Notebook与PyChard在图形渲染和交互方式上存在显著不同。左侧界面通常指代Jupyter环境,右侧界面指代PyCharm环境,两者在代码执行后的图表显示逻辑上有所区别。

接下来的所有示例代码均基于PyCharm开发环境进行演示和验证。
基础线性绘图与样式控制
首先演示最基础的绘图功能:在一个独立的窗口中绘制一条线性方程曲线。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列
print(x)
y = 2*x
plt.plot(x,y)
plt.show()

接着演示如何创建两个独立的窗口,分别绘制不同的线性方程。每个plt.figure()调用都会生成一个新的绘图窗口。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列
y1 = 2*x
y2 = 3*x
# 一个figure就是一个窗口
plt.figure()
plt.plot(x,y1)
# 一个figure就是一个窗口
plt.figure()
plt.plot(x,y2)
# 显示
plt.show()

随后展示如何在同一个窗口内绘制两条不同的线性方程曲线。通过多次调用plt.plot(),可以在同一坐标系中叠加显示多条数据曲线。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列
y1 = 2*x
y2 = 3*x
# 一个figure就是一个窗口
plt.figure()
plt.plot(x,y1)
plt.plot(x,y2)
# 显示
plt.show()

在基础绘图之上,可以进一步定义线条的视觉样式,包括颜色、线型(实线或虚线)以及线条宽度,以增强图表的可读性和美观度。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列
y = 2*x
# 一个figure就是一个窗口
plt.figure(num=1)
plt.plot(x,y)
plt.figure(num=2)
# color是线条的颜色
plt.plot(x,y,color='red')
plt.figure(num=3)
# linestyle 是线条的样式
plt.plot(x,y,linestyle='--')
plt.figure(num=4)
# linewidth 是线条的宽度
plt.plot(x,y,linewidth=3)
# 显示
plt.show()

坐标轴与图例设置
为了更精确地控制图表展示,需要设置X轴和Y轴的范围、标签文本以及刻度值。这有助于突出数据的关键区域并明确坐标含义。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列
y = 2*x
plt.figure(num=1)# 这里是figure1
plt.plot(x,y)
plt.figure(num=2)# 这里是figure2
plt.plot(x,y)
plt.xlim(0,3)# 设置x轴范围
plt.ylim(0,3)# 设置y轴范围
plt.xlabel('this is x')# 设置x轴标签
plt.ylabel('this is y')# 设置y轴标签
plt.figure(num=3)# 这里是figure3
plt.plot(x,y)
# 设置x轴刻度
x_ticks = np.linspace(1,3,3)
plt.xticks(x_ticks)
plt.figure(num=4)# 这里是figure4
plt.plot(x,y)
plt.ylim(0,3)# 设置y轴范围
plt.yticks([1,2],['bad','good'])# 设置y轴刻度
# 显示
plt.show()

散点图与柱状图应用
当图表中包含多条曲线时,添加图例(Legend)是区分不同数据系列的关键步骤。通过设置label参数并调用plt.legend(),可以自动生成图例说明。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,11)# 从0到1,个数为11的等差数列
y1 = 2*x
y2 = 3*x
plt.figure()
plt.plot(x,y1,label='y1')
plt.plot(x,y2,label='y2')
plt.legend()
# 显示
plt.show()

除了线性图,Matplotlib还支持散点图的绘制。散点图适用于展示两个变量之间的关系或分布情况,通过plt.scatter()函数实现。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randint(0,50,1024)
y = np.random.randint(0,50,1024)
plt.scatter(x,y,s=20)
# 隐藏 x 轴刻度
plt.xticks(())
# 显示
plt.show()

柱状图是展示分类数据对比的常用方式。使用plt.bar()函数可以生成基础的柱状图,直观展示不同类别的数值大小。
import numpy as np
import matplotlib.pyplot as plt
n = 6
x = np.arange(n)
print(x)
# 生成6个数,这6个数在0到1正态分布
y = np.random.uniform(0,1,n)
print(y)
plt.bar(x,y)
# 显示
plt.show()

等高线图与数值标注
在基础柱状图之上,可以进一步为每个柱子添加具体的数值标签。通过遍历数据并使用plt.text()函数,可以将精确的数值显示在柱子顶部或指定位置。
import numpy as np
import matplotlib.pyplot as plt
n = 6
X = np.arange(n)
Y = np.random.uniform(0,1,n)
plt.figure(num=1)
plt.bar(X,Y)
for x,y in zip(X,Y):
plt.text(x,y,y)
plt.figure(num=2)
plt.bar(X,Y)
for x,y in zip(X,Y):
plt.text(x,y,"%.2f"%y)
plt.figure(num=3)
plt.bar(X,Y)
for x,y in zip(X,Y):
plt.text(x,y,"%.2f"%y,ha='center')
plt.figure(num=4)
plt.bar(X,Y)
for x,y in zip(X,Y):
plt.text(x,y+0.01,"%.2f"%y,ha='center')
# 显示
plt.show()

子图创建与复杂布局
等高线图用于展示三维数据在二维平面上的分布。通过plt.contourf()填充颜色,并配合plt.contour()绘制轮廓线,可以清晰呈现数据的梯度变化。
import numpy as np
import matplotlib.pyplot as plt
def f(X,Y):
return X+Y
n = 256
x = np.linspace(0,3,n)
y = np.linspace(0,3,n)
X,Y=np.meshgrid(x,y)
plt.figure()
plt.contourf(X,Y,f(X,Y),4,cmap=plt.cm.hot)
plt.figure()
plt.contourf(X,Y,f(X,Y),9,cmap=plt.cm.hot)
plt.figure()
plt.contourf(X,Y,f(X,Y),9,cmap=plt.cm.hot)
plt.contour(X,Y,f(X,Y),9)
plt.figure()
plt.contourf(X,Y,f(X,Y),9,cmap=plt.cm.hot)
C = plt.contour(X,Y,f(X,Y),9)
plt.clabel(C,inline=True)
# 显示
plt.show()

当需要在同一张图中展示多个子图时,可以使用plt.subplot()函数。该函数允许将绘图区域划分为网格,并在指定位置放置子图。
import matplotlib.pyplot as plt
plt.figure()
# 两行两列的第一个位置,不加逗号也可以
plt.subplot(2,2,1)
plt.plot([0,1],[0,1])
# 两行两列的第二个位置,不加逗号也可以
plt.subplot(2,2,2)
plt.plot([0,2],[0,2])
# 两行两列的第三个位置,不加逗号也可以
plt.subplot(223)
plt.plot([0,3],[0,3])
# 两行两列的第四个位置,不加逗号也可以
plt.subplot(224)
plt.plot([0,4],[0,4])
plt.figure()
# 两行两列的第一个位置,不加逗号也可以
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])
# 两行两列的第二个位置,不加逗号也可以
plt.subplot(2,3,4)
plt.plot([0,2],[0,2])
# 两行两列的第三个位置,不加逗号也可以
plt.subplot(235)
plt.plot([0,3],[0,3])
# 两行两列的第四个位置,不加逗号也可以
plt.subplot(236)
plt.plot([0,4],[0,4])
# 显示
plt.show()

展示常用的子图排列方式,包括不同行列组合下的子图放置。通过调整subplot参数,可以实现灵活的子图布局。
plt.figure(figsize=(20,10))
for i in range(40):
plt.subplot(4,10,i+1)
plt.xticks()
plt.yticks()
plt.grid(False)
plt.imshow(train_images[i],cmap=plt.cm.binary_r)
plt.title(train_labels[i])
plt.show()

对于更复杂的排版需求,可以使用plt.subplot2grid()函数进行精细的格子布局。该函数支持跨行和跨列的合并,适合构建复杂的仪表盘或多面板图表。
import matplotlib.pyplot as plt
plt.figure()
# 三行三列的布局,从0行0列开始,占一行三列
ax1 = plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)
ax1.plot([0,1],[0,1])
ax1.set_title('this is ax1')
# 三行三列的布局,从1行0列开始,占一行两列
ax2 = plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=1)
# 三行三列的布局,从1行2列开始,占两行一列
ax3 = plt.subplot2grid((3,3),(1,2),colspan=1,rowspan=2)
# 三行三列的布局,从2行0列开始,占一行一列
ax4 = plt.subplot2grid((3,3),(2,0),colspan=1,rowspan=1)
# 三行三列的布局,从2行1列开始,占一行一列
ax5 = plt.subplot2grid((3,3),(2,1),colspan=1,rowspan=1)
# 显示
plt.show()

以上涵盖了Python可视化中Matplotlib库的核心实例。通过掌握线性图、散点图、柱状图、等高图以及子图布局的技巧,可以应对大多数数据可视化需求。更多高级用法和细节请参考官方文档及相关技术文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









