首页 > 解决方案 > 以不同角度跨 Contourf 图切片以获得 2D 线图

问题描述

我正在尝试以 matplotlib 轮廓图的不同角度或切片生成 2D 线图。

作为下面 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 变化。

生成的源等高线图是: 等高线图

标签: pythonnumpymatplotlibcontourf

解决方案


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

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()

示例图


推荐阅读