我正在尝试保存使用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')
我尝试使用
获取colorbarcbar = ax.colorbar()
但是得到一个错误AttributeError:'AxesSubplot'对象没有属性'colorbar'。
我搜索了解决方案并在这里发现了一些问题,建议使用plt.imshow()来获取colorbar对象,但我现在对我正在做的事情感到困惑。 有人可以建议,如果可能的话,解释为什么,实现matplotlib文档为colorbar提供的解决方案?
答案 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
仅返回绘制colorbar
和cbar
的轴句柄,因此您无法直接访问映射对象,源代码中的pcolormesh
。因此,您无法应用此黑客攻击。
一种解决方案是使用colorbar
和import 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;
}
}
当你放大时,我的结果似乎摆脱了白线。