如何在Python中创建一对图,如下所示: 但是使用热图代替点(或者代替“hex bin”图)?有可能改为显示对数热图计数将是一个额外的好处。 (对角线上的直方图非常精细。)
“热图”是指计数的二维直方图,显示为Seaborn's或Wikipedia's热图:
使用Pandas,seaborn或matplotlib会很棒(也许是plot.ly)。
我尝试了下面的天真变化,但无济于事:
pairplot = sns.PairGrid(data) # sns = seaborn
pairplot.map_offdiag(sns.kdeplot) # Off-diagnoal heat map wanted instead!
pairplot.map_diag(plt.hist) # plt = matplotlib.pyplot
(上面使用的是核心密度估算器,我不想要;也可以用Pandas获得十六进制bin网格,但我正在寻找一个“方形”2D直方图和Matplotlib的hist2d()
没有'工作)。
答案 0 :(得分:8)
你的答案的关键是matplotlib函数plt.hist2d
,它使用色标("热图")绘制矩形区间内的计数。它的API几乎与PairGrid
兼容,但并不完全兼容,因为它不知道如何处理color=
kwarg。通过编写瘦包装函数可以轻松解决这个问题。此外,如果您希望色彩映射以对数方式映射计数,则可以使用matplotlib LogNorm
轻松完成:
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
sns.set_style("white")
iris = sns.load_dataset("iris")
g = sns.PairGrid(iris)
g.map_diag(plt.hist, bins=20)
def pairgrid_heatmap(x, y, **kws):
cmap = sns.light_palette(kws.pop("color"), as_cmap=True)
plt.hist2d(x, y, cmap=cmap, cmin=1, **kws)
g.map_offdiag(pairgrid_heatmap, bins=20, norm=LogNorm())
答案 1 :(得分:6)
的制备:将
%matplotlib inline #for jupyter notebook
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
新答案:
g = sns.PairGrid(iris)
g = g.map_upper(plt.scatter,marker='+')
g = g.map_lower(sns.kdeplot, cmap="hot",shade=True)
g = g.map_diag(sns.kdeplot, shade=True)
sns.plt.show()
答案:
g = sns.PairGrid(iris)
g = g.map_upper(plt.scatter)
g = g.map_lower(sns.kdeplot, cmap="hot",shade=True)
g = g.map_diag(plt.hist)
sns.plt.show()