如何在不看轮廓线的情况下在Seaborn kdeplot中使用带变量alpha的colourmaps?

时间:2018-03-12 22:36:28

标签: matplotlib seaborn

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

我遇到的问题是轮廓之间的线条是可见的。我得到的结果是:Visible contour lines in a Seaborn kdeplot

当我发现这个问题时,我以为我找到了答案: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时,轮廓线之间的线条会被一条窄的白线代替:

Visible contour lines in a Seaborn kdeplot with antialiasing

我也试过类似这个问题的方法 - 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()

这导致白线和暗线混合 - Visible contour lines in a Seaborn kdeplot

我相信由于轮廓带的宽度可变,我无法调整线宽以使线条消失。

使用这两种方法(抗锯齿+线宽)使这个版本看起来很酷但不是我想要的: Visible contour lines in a Seaborn kdeplot

我也发现了这个问题 - 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)

这会导致: Visible contour lines in a Seaborn kdeplot - double plot

这更好,而且几乎可行。这里的问题是我需要在整个colourmap中使用变量(和非线性)alpha。当轮廓相互绘制时,可变条带和线条似乎是α组合的结果。我还在结果中看到一些清晰/白色的线条。

0 个答案:

没有答案