用matplotlib / seaborn绘制两幅图像之间的差异

时间:2018-04-01 01:31:46

标签: python matplotlib seaborn

我试图绘制我修改过的两张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()

MWE illustrating sns.heatmap usage

matplotlib的imshow很容易保存为PDF(虽然颜色栏有一些对齐和尺寸问题)。 然而,seaborn的heatmap解决了这个问题的代价是矢量密集的PDF:6.2MB与3.7MB之后,用ps2pdf14 -dPDFSETTINGS=/prepress进行压缩。

在保留seaborn的美学优势的同时,还有其他高效的方法吗?

1 个答案:

答案 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