【问题标题】:Slices across Contourf plots at different angles to get 2D line plots以不同角度跨 Contourf 图切片以获得 2D 线图
【发布时间】:2021-06-01 12:16:09
【问题描述】:

我正在尝试在 matplotlib contourf 图的不同角度或切片上生成 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 变化。

生成的源等高线图是:

【问题讨论】:

    标签: python numpy matplotlib contourf


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我认为它适用于这个示例,但由于这是一个 MVE,我生成了 Z 函数作为示例。如果我不知道实际的 Z 函数,并且 Z 值是稀疏的测量数据,中间有插值怎么办。有什么方法可以在不知道实际功能的情况下匹配 xline、yline 位置的 Z 值?我不确定如何在不基于原始计算(仅匹配)的情况下提取 zline 值。
    • 曲线的代码只使用创建等高线图的点;它不使用计算 Z 的函数。如果您的 Z 值不在网格上,您可以通过 scipy.interpolate.griddata 计算插值网格。
    • 我现在看到了,谢谢。我想我找到了另一个解决方案,这不是我所需要的,而是一个很好的起点——与 JohanC 的解决方案一起。 stackoverflow.com/questions/7878398/…
    • 我使用笛卡尔坐标让它工作。我想知道是否有人知道如何在极坐标而不是笛卡尔坐标中绘制线条,然后将其转换为笛卡尔坐标以获得特定角度?我们将如何指定半径(因为它需要在当前空间中限定?
    猜你喜欢
    • 2021-10-28
    • 2019-05-22
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多