Luc*_*nse 7 python matplotlib seaborn
所以我使用seaborn做一个kdeplot
有sns.kdeplot(x, y, ax=plt.gca(), cmap="coolwarm")
.
我可以用levels
kwarg 改变等级,但我也希望能够标记轮廓.在matplotlib你只需要做,plt.clabel(CS, CS.levels, inline=True)
但seaborn不会返回轮廓集合CS
.
我该怎么做?或者我只是自己从头开始做这件事?
编辑:有没有办法制作一个也会返回CS的包装器?我看不出怎么样......
不幸的是,seaborn会尽一切努力使countourset对用户保密.除了从数据中绘制一个plt.contour
实际上并不太难的图表之外,你还可以看到猴子修补_bivariate_kdeplot
它并让它返回计数器以供进一步使用.
这看起来如下:
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(10)
import seaborn as sns
import seaborn.distributions as sd
from seaborn.palettes import color_palette, blend_palette
from six import string_types
def _bivariate_kdeplot(x, y, filled, fill_lowest,
kernel, bw, gridsize, cut, clip,
axlabel, cbar, cbar_ax, cbar_kws, ax, **kwargs):
"""Plot a joint KDE estimate as a bivariate contour plot."""
# Determine the clipping
if clip is None:
clip = [(-np.inf, np.inf), (-np.inf, np.inf)]
elif np.ndim(clip) == 1:
clip = [clip, clip]
# Calculate the KDE
if sd._has_statsmodels:
xx, yy, z = sd._statsmodels_bivariate_kde(x, y, bw, gridsize, cut, clip)
else:
xx, yy, z = sd._scipy_bivariate_kde(x, y, bw, gridsize, cut, clip)
# Plot the contours
n_levels = kwargs.pop("n_levels", 10)
cmap = kwargs.get("cmap", "BuGn" if filled else "BuGn_d")
if isinstance(cmap, string_types):
if cmap.endswith("_d"):
pal = ["#333333"]
pal.extend(color_palette(cmap.replace("_d", "_r"), 2))
cmap = blend_palette(pal, as_cmap=True)
else:
cmap = plt.cm.get_cmap(cmap)
kwargs["cmap"] = cmap
contour_func = ax.contourf if filled else ax.contour
cset = contour_func(xx, yy, z, n_levels, **kwargs)
if filled and not fill_lowest:
cset.collections[0].set_alpha(0)
kwargs["n_levels"] = n_levels
if cbar:
cbar_kws = {} if cbar_kws is None else cbar_kws
ax.figure.colorbar(cset, cbar_ax, ax, **cbar_kws)
# Label the axes
if hasattr(x, "name") and axlabel:
ax.set_xlabel(x.name)
if hasattr(y, "name") and axlabel:
ax.set_ylabel(y.name)
return ax, cset
# monkey patching
sd._bivariate_kdeplot = _bivariate_kdeplot
# some data
mean, cov = [0, 2], [(1, .5), (.5, 1)]
x, y = np.random.multivariate_normal(mean, cov, size=50).T
# plot
fig, ax = plt.subplots()
_, cs = sns.kdeplot(x, y, ax=ax, cmap="coolwarm")
# label the contours
plt.clabel(cs, cs.levels, inline=True)
# add a colorbar
fig.colorbar(cs)
plt.show()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1936 次 |
最近记录: |