以不同角度对 Contourf 图进行切片以获得 2D 线图

Slices across Contourf plots at different angles to get 2D line plots

我正在尝试以不同角度或 matplotlib contourf 图的切片生成二维线图。

以下面的 matplotlib contourf 演示示例为例

import numpy as np
import matplotlib.pyplot as plt

origin = 'lower'

delta = 0.025

x = y = np.arange(-3.0, 3.01, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

nr, nc = Z.shape


fig1, ax2 = plt.subplots(constrained_layout=True)
CS = ax2.contourf(X, Y, Z, 10, cmap=plt.cm.viridis, origin=origin,extend='both')



ax2.set_title('Random Plot')
ax2.set_xlabel('X Axis')
ax2.set_ylabel('Y Axis')
cbar = fig1.colorbar(CS)

理想情况下,我想在地图上生成不同角度(30、45、60 度)的线(从任意点开始直到现有数组的末尾),然后绘制该线上的 Z 变化。

我认为原则上更简单的问题是,从 (X2,Y2) 到 (X1,Y1) 的直线并绘制给定轮廓(已经是插值数据)的 Z 变化。

例如,原始问题是从 (-3,-3) 以 45 度角跨过的直线。类似的问题是假设一条从 (-3,-3) 到 (3,3) 的线,并绘制该线上不同位置的 Z 变化。

生成的源等高线图是:

这是一个相当低效的方法,但它确实有效。它重新计算新网格上的函数,它只需要对角线。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import RectBivariateSpline

delta = 0.025

x = y = np.arange(-3.0, 3.01, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X ** 2 - Y ** 2)
Z2 = np.exp(-(X - 1) ** 2 - (Y - 1) ** 2)
Z = (Z1 - Z2) * 2

nr, nc = Z.shape

x1, y1 = -3, -2
x2, y2 = 3, 2

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(15, 5))
CS = ax1.contourf(X, Y, Z, 10, cmap=plt.cm.viridis, origin='lower', extend='both')
ax1.plot([x1, x2], [y1, y2], color='k', ls='--', lw=3, alpha=0.6)
ax1.set_xlabel('X Axis')
ax1.set_ylabel('Y Axis')
cbar = fig.colorbar(CS, ax=ax1)

spline_func = RectBivariateSpline(x, y, Z)
xline = np.linspace(x1, x2, 200)
yline = np.linspace(y1, y2, 200)
zline = spline_func(xline, yline)
ax2.plot(xline, zline.diagonal())
ax2.set_xlabel('X Axis')
ax2.set_ylabel('Z Axis')

plt.show()