【问题标题】:How to plot a smooth 2D color plot for z = f(x, y)如何为 z = f(x, y) 绘制平滑的 2D 彩色图
【发布时间】:2015-05-29 01:55:52
【问题描述】:

我正在尝试使用 matplotlib 绘制 2D 字段数据。所以基本上我想要类似的东西:

在我的实际情况中,我将数据存储在硬盘驱动器上的文件中。然而,为简单起见,请考虑函数 z = f(x, y)。我想要一个平滑的 2D 图,其中 z 使用颜色可视化。我使用以下代码行管理绘图:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 21)
y = np.linspace(-1, 1, 21)
z = np.array([i*i+j*j for j in y for i in x])

X, Y = np.meshgrid(x, y)
Z = z.reshape(21, 21)

plt.pcolor(X, Y, Z)
plt.show()

但是,我获得的情节非常粗糙。有没有一种非常简单的方法来平滑情节?我知道surface 的情节可能会发生类似的事情,但是,这些是 3D 的。我可以改变摄像机角度来获得 2D 表示,但我相信有一种更简单的方法。我也试过imshow,但我必须在graphic坐标中思考,原点在左上角。

问题已解决

我设法解决了我的问题:

plt.imshow(Z,origin='lower',interpolation='bilinear')

【问题讨论】:

  • 唯一将链接图与您的图分开的是您的网格要粗糙得多。将 21 更改为更大的值,例如 101 或 1001。
  • 是的,我知道,但即使网格点数量较少,也可以使用插值获得平滑图。 imshow 有这个能力。我可以用pcolor 做类似的事情吗?
  • 请编辑您的问题以准确地描述您想要什么,并附上一个有代表性的例子。

标签: python matplotlib plot


【解决方案1】:

如果您无法更改网格粒度,请尝试使用imshow,它本质上会将任何二维矩阵绘制为图像,其中每个矩阵单元的值代表构成该像素的颜色。使用您的示例值:

In [3]: x = y = np.linspace(-1, 1, 21)
In [4]: z = np.array([i*i+j*j for j in y for i in x])
In [5]: Z = z.reshape(21, 21)
In [7]: plt.imshow(Z, interpolation='bilinear')
Out[7]: <matplotlib.image.AxesImage at 0x7f4864277650>
In [8]: plt.show()

【讨论】:

  • 我知道这一点。但我提出的案例很简单。我实际上将数据存储在txt 文件中,因此我无法调整数据。所以是的,在一个简单的函数案例中,我可以做到这一点。但是,如果从第三方获得数据,您会怎么做?
  • 谢谢我刚才也来了。我还添加了origin='lower' 作为参数,使原点位于左下角。
【解决方案2】:

你可以使用contourf

plt.contourf(X, Y, Z)

编辑:

对于更多级别(更平滑的颜色过渡),您可以使用更多级别(轮廓)

例如:

plt.contourf(X, Y, Z, 100)

【讨论】:

  • 这在区域之间有明显的分隔。我想要一个平滑的渐变
  • 你可以增加关卡的数量。我会更新说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多