我试图绘制我修改过的两张1000x1000图像之间的差异。 MWE如下(其中右上角和左下角将是这些图像):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib.ticker as tck
import seaborn as sns
import numpy
sns.set(style='dark')
imagen2 = plt.figure(1, figsize=(5, 5))
imagen2.suptitle('StackOverflow Matplotlib colorbar demo')
dat = numpy.random.randn(1000, 1000)
top_left = plt.subplot(221)
top_left.imshow(dat)
top_right = plt.subplot(222, sharex=top_left, sharey=top_left)
top_right.imshow(dat)
bottom_left = plt.subplot(223, sharex=top_left, sharey=top_left)
bottom_left.imshow(dat)
bottom_right = plt.subplot(224, sharex=top_left, sharey=top_left)
# problem_plot = bottom_right.imshow(dat)
# plt.colorbar(problem_plot, fraction=0.045, pad=0.04)
problem_plot = sns.heatmap(dat)
problem_plot.xaxis.set_major_locator(tck.MultipleLocator(200))
problem_plot.xaxis.set_major_formatter(tck.ScalarFormatter())
problem_plot.yaxis.set_major_locator(tck.MultipleLocator(200))
problem_plot.yaxis.set_major_formatter(tck.ScalarFormatter())
plt.tight_layout(rect=(0, 0, 1, 0.95))
plt.show()
matplotlib的imshow
很容易保存为PDF(虽然颜色栏有一些对齐和尺寸问题)。
然而,seaborn的heatmap
解决了这个问题的代价是矢量密集的PDF:6.2MB与3.7MB之后,用ps2pdf14 -dPDFSETTINGS=/prepress
进行压缩。
在保留seaborn的美学优势的同时,还有其他高效的方法吗?
答案 0 :(得分:0)
我想要的是制作一个不会将每个单元格渲染为单个矢量对象的热图。即我希望对热图进行光栅化处理,就像imshow
对数组一样。
seaborn's heatmap在幕后使用matplotlib's pcolormesh(这是隐藏在其文档的一角)。它有一个可选的Bool参数rasterized
,它完全符合我的要求。
我编辑了heatmap
来看如下:
problem_plot = sns.heatmap(dat, rasterized=True)
使用time caffeinate python stackoverflow.py
,Python 3.6.5(来自Homebrew),MacOS Sierra 10.12.6进行测量。
matplotlib' s imshow
:2.4MB pdf未压缩,压缩后1.1MB。
real 0m2,089s
user 0m1,797s
sys 0m0,211s
seaborn' s heatmap
没有rasterized
:23.8MB pdf未压缩,压缩后7.5MB。并且它仍然需要很多加载(尝试在pdf.js查看器中执行它以查看它渲染热图的每个单元格)。
real 4m36,585s
user 4m27,727s
sys 0m3,512s
seaborn heatmap
w / rasterized
:2.5MB pdf未压缩,压缩后1.2MB(与imshow
大致相同)。
real 0m3,306s
user 0m2,932s
sys 0m0,313s