Matplotlib中使用向量格式的热力图

8
我是一位有用的助手,能够翻译文本。

我正在尝试使用matplotlib绘制我的模拟结果的3D热图。我已经阅读了这个主题并尝试使用imshow。不幸的是,当我以SVG或EPS格式保存图像时,它会将热图转换为图片(这对于期刊来说是不可接受的)。因此,我也尝试了hexbin - 但图片看起来很奇怪。我不确定期刊是否会接受它。我们是否还有其他选择,或者我必须通过矩形填充热图?

例如,如果运行以下代码:

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

# Generate some test data
x = np.random.randn(8873)
y = np.random.randn(8873)

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

print extent
print heatmap
plt.clf()
surf = plt.imshow(heatmap, extent=extent)
plt.colorbar(surf, shrink=0.75, aspect=5)
plt.show()

并保存SVG文件,其中包含PNG图像:

   <g clip-path="url(#p6def4f5150)">
    <image height="347" width="315" x="115.127800906" xlink:href="data:image/png;base64,

我在OpenSUSE和Ubuntu操作系统下使用版本为1.1.1的matplotlib。


@tcaswell 我已经编辑了主题。 - rth
1个回答

11

如果您希望输出矢量图,请使用 pcolormesh 替代 imshow。但是请注意,使用 pcolor 或者 pcolormesh 时不能进行插值操作。不过,如果您希望输出矢量图,则不需要插值操作。

这就是为什么 imshowpcolor/pcolormesh 之间存在差异的基本原因。imshow 生成的是栅格图像,而 pcolormeshpcolor 则生成矩形补丁。

您还需要略微更改传入的图像范围参数。下面是一个基于您代码的示例:

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

# Generate some test data
x = np.random.randn(8873)
y = np.random.randn(8873)

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)

surf = plt.pcolormesh(xedges, yedges, heatmap)
plt.axis('image')
plt.colorbar(surf, shrink=0.75, aspect=5)
plt.show()

在此输入图片描述

保存为 svg 格式时,输出将为向量路径。例如:

...
   <g id="QuadMesh_1">
    <defs>
     <path d="
M75.9063 -43.2
L82.9705 -43.2
L82.9705 -50.112
L75.9063 -50.112
L75.9063 -43.2" id="C0_0_9d1ab33858"/>
     <path d="
M82.9705 -43.2
L90.0348 -43.2
L90.0348 -50.112
L82.9705 -50.112
L82.9705 -43.2" id="C0_1_d828245e6a"/>
...

谢谢!它有效了! :) 你能解释一下这个:'plt.axis('image')'是什么意思吗? - rth
它将绘图的长宽比设置为1(即正方形像素将是正方形),并修剪限制。它只是为了使输出看起来类似于“imshow”。 - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接