8

我正在尝试使用 matplotlib 用我的模拟结果绘制 3D 热图。我已阅读此主题并尝试使用 imshow。不幸的是,当我将图形保存为 SVG 或 EPS 格式时,它会将 heatmat 转换为图片(这对于期刊来说是不可接受的)。所以,我也尝试过 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 操作系统下使用 matplotlib,版本 1.1.1。

4

1 回答 1

11

如果您想要矢量输出 ,请使用pcolormesh您正在使用的位置。imshow

但是,在使用时pcolorpcolormesh您不能对图像进行插值。另一方面,如果您想要矢量输出,您可能不需要插值。

imshow这基本上就是和pcolor/之间存在差异的原因pcolormeshimshow产生一个栅格,同时产生一个pcolormesh矩形pcolor块。

您还需要稍微改变您在图像范围内传递的方式。作为基于您的示例:

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"/>
...
于 2013-05-31T21:15:23.413 回答