Python版本:3.6.4(Windows上的Anaconda) Seaborn:0.8.1 Matplotlib:2.1.2
我正在尝试使用Seaborn创建2D核心密度图,但我希望colourmap中的每一步都有不同的alpha值。我看了一下这个问题来创建一个带有alpha值的matplotlib colourmap:Add alpha to an existing matplotlib colormap。
当我发现这个问题时,我以为我找到了答案:Hide contour linestroke on pyplot.contourf to get only fills。我尝试了答案中概述的方法(使用set_edgecolor("face")
,但在这种情况下它不起作用。这个问题似乎也与矢量图形格式有关,我只是写出了一个PNG。
这是我的剧本:
import numpy as np
import seaborn as sns
import matplotlib.colors as cols
import matplotlib.pyplot as plt
def alpha_cmap(cmap):
my_cmap = cmap(np.arange(cmap.N))
# Set a square root alpha.
x = np.linspace(0, 1, cmap.N)
my_cmap[:,-1] = x ** (0.5)
my_cmap = cols.ListedColormap(my_cmap)
return my_cmap
xs = np.random.uniform(size=100)
ys = np.random.uniform(size=100)
kplot = sns.kdeplot(data=xs, data2=ys,
cmap=alpha_cmap(plt.cm.viridis),
shade=True,
shade_lowest=False,
n_levels=30)
plt.savefig("example_plot.png")
在对这个问题的一些评论的指导下,我尝试了一些其他方法,当这个问题出现时,这些方法已经成功。根据这个问题(Matplotlib Contourf Plots Unwanted Outlines when Alpha < 1),我试图改变情节调用:
sns.kdeplot(data=xs, data2=ys,
cmap=alpha_cmap(plt.cm.viridis),
shade=True,
shade_lowest=False,
n_levels=30,
antialiased=True)
使用antialiased=True
时,轮廓线之间的线条会被一条窄的白线代替:
我也试过类似这个问题的方法 - Pyplot pcolormesh confused when alpha not 1。这种方法基于在PathCollections
中循环kplot.collections
并调整边的参数,使它们变得不可见。我尝试添加此代码并调整线宽 -
for thing in kplot.collections:
thing.set_edgecolor("face")
thing.set_linewidth(0.01)
fig.canvas.draw()
我相信由于轮廓带的宽度可变,我无法调整线宽以使线条消失。
使用这两种方法(抗锯齿+线宽)使这个版本看起来很酷但不是我想要的:
我也发现了这个问题 - Changing Transparency of/Remove Contour Lines in Matplotlib
这个建议在同一轴上过度绘制具有不同轮廓水平数的第二个图,例如:
kplot = sns.kdeplot(data=xs, data2=ys,
ax=ax,
cmap=alpha_cmap(plt.cm.viridis),
shade=True,
shade_lowest=False,
n_levels=30,
antialiased=True)
kplot = sns.kdeplot(data=xs, data2=ys,
ax=ax,
cmap=alpha_cmap(plt.cm.viridis),
shade=True,
shade_lowest=False,
n_levels=35,
antialiased=True)
这更好,而且几乎可行。这里的问题是我需要在整个colourmap中使用变量(和非线性)alpha。当轮廓相互绘制时,可变条带和线条似乎是α组合的结果。我还在结果中看到一些清晰/白色的线条。