修改matplotlib和seaborn中的colorbar

时间:2015-11-11 14:06:30

标签: python matplotlib seaborn

我正在尝试保存使用seaborn生成的图像。图像是4x4混淆矩阵('confmat'np.array)。我了解到,当我以矢量格式保存图像时,某些查看器会出现问题,从而在colorbar上产生白线,引用matplotlib参考:

  

众所周知,某些矢量图形查看器(svg和pdf)呈现   色条的各段之间的白色间隙。这是由于错误造成的   观众不是matplotlib。作为一种解决方法,colorbar可以   使用重叠段渲染:

     

cbar = colorbar()

     

cbar.solids.set_edgecolor(“face”)

     

拉​​伸()

但是,我在做建议时遇到了麻烦。

这是我做的:

import seaborn as sns
import matplotlib.pyplot as plt

cmap=plt.cm.Blues

fig, ax = plt.subplots()

ax = sns.heatmap(confmat, annot=True, cmap=cmap)
ax.set_title('title')
ax.tick_params(
    axis='both',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    bottom='off',      # ticks along the bottom edge are off
    top='off',         # ticks along the top edge are off
    labelbottom='off',  # labels along the bottom edge are off
    labelleft='off',
    right='off')

fig.savefig('confusion_matrix.svg', format='svg')

我尝试使用

获取colorbar
cbar = ax.colorbar()

但是得到一个错误AttributeError:'AxesSubplot'对象没有属性'colorbar'。

我搜索了解决方案并在这里发现了一些问题,建议使用plt.imshow()来获取colorbar对象,但我现在对我正在做的事情感到困惑。 有人可以建议,如果可能的话,解释为什么,实现matplotlib文档为colorbar提供的解决方案?

2 个答案:

答案 0 :(得分:4)

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

x = np.random.randn(10, 10)

f, ax = plt.subplots()
sns.heatmap(x)
cbar_ax = f.axes[-1]
cbar_solids = cbar_ax.collections[0]
cbar_solids.set_edgecolor("face")
f.savefig("heatmap.svg")

答案 1 :(得分:1)

根据matplotlib文档中的建议更改cb.solid.set_edgecolor("face") cb_kwargs似乎有点黑客,以确保颜色条上的元素之间没有白线。我认为seaborn的设计假设您应该能够通过传递kwargs(热图中的cbar_kws)来完成所需的一切。例如,您可以将sns.heatmap传递给cbar_kws={"drawedges": "False"}函数Seaborn,但不幸的是,这并不能解决问题。

由于Heatmap heatplot仅返回绘制colorbarcbar的轴句柄,因此您无法直接访问映射对象,源代码中的pcolormesh。因此,您无法应用此黑客攻击。

一种解决方案是使用colorbarimport seaborn as sns import matplotlib.pyplot as plt import numpy as np cmap=plt.cm.Blues fig, ax = plt.subplots() confmat = np.random.rand(4, 4) cb = ax.pcolormesh(confmat, cmap=cmap) ax.set_title('title') ax.tick_params( axis='both', # changes apply to the x-axis which='both', # both major and minor ticks are affected bottom='off', # ticks along the bottom edge are off top='off', # ticks along the top edge are off labelbottom='off', # labels along the bottom edge are off labelleft='off', right='off') cbar = plt.colorbar(cb) cbar.solids.set_edgecolor("face") plt.draw() fig.savefig('confusion_matrix.svg', format='svg') 绘制此图。我认为seaborn实际上重新定义了matplotlib样式,所以应该看起来一样,

package fogames.tamagomonsters;

public class Area {

    public String name;
    public String number;

    public Area(String name, String number) {
        this.name = name;
        this.number = number;
    }
}

当你放大时,我的结果似乎摆脱了白线。