Matplotlib画等高线图
matplotlib是Python中常用的绘图库,它提供了丰富的功能和灵活的API,可以用来创建各种类型的图表。在这篇文章中,我们将重点介绍matplotlib中的contour功能。等高线图是一种常用的二维数据可视化方式,它能够直观地展示数据的分布和变化规律。通过等高线图,我们可以清晰地看出数据的高低变化,从而更好地理解数据的含义。
基本等高线图
首先,让我们来看一个简单的基本等高线图示例。假设我们有一组二维数据,我们可以使用matplotlib中的contour
函数来绘制等高线图。下面是一个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contour(X, Y, Z)
plt.show()
Output:
运行以上代码,我们可以看到绘制出的基本等高线图。在这个例子中,我们使用了np.linspace
函数生成一组x和y的值,并用np.meshgrid
函数将这些值组合成网格。然后我们计算出z值,即sin(x) * cos(y)。最后,我们使用plt.contour
函数绘制等高线图。
自定义等高线图样式
在等高线图中,我们可以对图形进行一些自定义样式,以展示更多有关数据的信息。例如,我们可以添加颜色条、修改线型、改变标签等。下面是一个自定义等高线图的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contourf(X, Y, Z, levels=20, cmap='coolwarm')
plt.colorbar()
plt.title('Customized Contour Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用了plt.contourf
函数绘制填充颜色的等高线图,并使用cmap
参数设置颜色映射。我们还使用levels
参数设置等高线的数量。最后,我们通过plt.colorbar
函数添加颜色条,并通过plt.title
、plt.xlabel
和plt.ylabel
函数添加标题和坐标轴标签。
等高线图的子图布局
有时候我们需要在一个图形中展示多个等高线图,可以使用子图布局来实现。下面是一个展示多个等高线图的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
for i in range(2):
for j in range(2):
Z = np.sin(X) * np.cos(Y + i*j*np.pi/2)
axs[i, j].contourf(X, Y, Z, levels=20, cmap='coolwarm')
axs[i, j].set_title(f'Plot {i+1}-{j+1}')
plt.show()
Output:
在这个例子中,我们使用plt.subplots
函数创建一个2×2的子图布局,并在每个子图中绘制不同的等高线图。通过循环遍历每个子图,我们可以方便地定制每个子图的样式和数据。
等高线图与散点图结合
除了单独绘制等高线图,还可以将其与其他类型的图表结合起来。例如,我们可以将等高线图与散点图结合,以展示数据的分布和变化。下面是一个等高线图与散点图结合的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
x1 = np.random.uniform(-2*np.pi, 2*np.pi, 100)
y1 = np.random.uniform(-2*np.pi, 2*np.pi, 100)
z1 = np.sin(x1) * np.cos(y1)
plt.contourf(X, Y, Z, levels=20, cmap='coolwarm')
plt.scatter(x1, y1, c=z1, cmap='coolwarm', label='Scatter Plot')
plt.colorbar()
plt.title('Contour Plot with Scatter Plot')
plt.show()
Output:
在这个例子中,我们首先生成一组随机数据,并使用plt.scatter
函数绘制散点图。然后在等高线图上使用plt.contourf
函数绘制等高线图,并使用plt.scatter
函数将散点图与等高线图结合起来。通过这种方式,我们可以更直观地展示数据的分布。
不规则数据的等高线图
有时候,我们的数据并不是规则网格状的,而是不规则的点集。在这种情况下,我们可以使用tricontour
函数来绘制不规则数据的等高线图。下面是一个不规则数据的等高线图示例:
from matplotlib.tri import Triangulation
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
x = np.random.rand(50)
y = np.random.rand(50)
tri = Triangulation(x, y)
z = np.sin(x) * np.cos(y)
plt.tricontourf(tri, z, levels=20, cmap='coolwarm')
plt.colorbar()
plt.title('Irregular Contour Plot')
plt.show()
在这个例子中,我们首先使用Triangulation
函数创建一个不规则的三角形网格,然后使用plt.tricontourf
函数绘制不规则数据的等高线图。通过这种方式,我们可以适应更加复杂的数据结构。
填充等高线图
在等高线图中,我们不仅可以绘制线条,还可以填充等高线图形成区域。下面是一个填充等高线图的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contourf(X, Y, Z, levels=20, cmap='coolwarm')
plt.contour(X, Y, Z, colors='black', linewidths=2)
plt.colorbar()
plt.title('Filled Contour Plot')
plt.show()
Output:
在这个例子中,我们先使用plt.contourf
函数绘制填充等高线图,再使用plt.contour
函数绘制线条,以突出等高线的形状。
透明度设置
在等高线图中,我们还可以通过设置透明度来调整图形的显示效果。下面是一个设置透明度的等高线图示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contourf(X, Y, Z, levels=20, alpha=0.5)
plt.colorbar()
plt.title('Contour Plot with Transparency')
plt.show()
Output:
在这个例子中,我们使用plt.contourf
函数绘制等高线图,并通过alpha
参数设置透明度为0.5,使得图形半透明显示。
自定义等高线线型
除了调整颜色和填充方式外,我们还可以自定义等高线的线型。下面是一个自定义等高线线型的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contour(X, Y, Z, levels=10, linestyles='dashed')
plt.colorbar()
plt.title('Contour Plot with Custom Line Style')
plt.show()
Output:
在这个例子中,我们使用plt.contour
函数绘制等高线图,并通过linestyles
参数设置线型为虚线,以使得等高线具有不同的线型。
等高线的标签设置
在等高线图中,我们可以通过设置标签来展示每个等高线的数值。下面是一个设置等高线标签的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
CS = plt.contour(X, Y, Z, levels=10)
plt.clabel(CS, inline=True, fontsize=8, colors='black')
plt.colorbar()
plt.title('Contour Plot with Labels')
plt.show()
Output:
在这个例子中,我们使用plt.contour
函数绘制等高线图,并通过plt.clabel
函数设置标签。通过调整inline
参数、fontsize
参数和colors
参数,我们可以自定义等高线标签的显示方式。
等高线的边框设置
在等高线图中,我们还可以设置等高线的边框样式。下面是一个设置等高线边框样式的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contour(X, Y, Z, levels=10, linewidths=2, linestyles='dotted')
plt.colorbar()
plt.title('Contour Plot with Custom Border Style')
plt.show()
Output:
在这个例子中,我们使用plt.contour
函数绘制等高线图,并通过linewidths
参数和linestyles
参数设置边框的线宽和线型,以使得等高线具有不同的边框样式。
等高线间距设置
在等高线图中,我们还可以通过设置等高线的间距来调整等高线的密集程度。下面是一个设置等高线间距的示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contour(X, Y, Z, levels=np.linspace(-1,1,21))
plt.colorbar()
plt.title('Contour Plot with Custom Spacing')
plt.show()
Output:
在这个例子中,我们使用np.linspace
函数生成一组间距均匀的等高线数值,并通过levels
参数设置等高线的间距,以调整等高线的密集程度。
等高线图的坐标变换
在等高线图中,我们还可以对坐标进行变换,以展示不同的数据视角。下面是一个进行坐标变换的等高线图示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y = np.linspace(-2*np.pi, 2*np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.contour(X, Y, Z, levels=10)
plt.gca().set_aspect('equal')
plt.gca().invert_yaxis()
plt.colorbar()
plt.title('Contour Plot with Coordinate Transformation')
plt.show()
Output:
在这个例子中,我们使用plt.gca().set_aspect
函数设置坐标轴比例为相等,并使用plt.gca().invert_yaxis
函数反转y轴方向,以展示不同的数据视角。
通过以上示例,我们可以看到matplotlib中等高线图的基本绘制方法及常用样式设置。使用等高线图能够直观地展示数据的分布和变化规律,帮助我们更好地理解数据的含义,并为数据分析和可视化提供了强大的工具。