Seaborn和pd.scatter_matrix()绘图颜色问题

3
我正在基于鸢尾花数据集的DataFrame创建pd.scatter_matrix()图,并根据目标变量(植物种类)进行着色。当我运行下面的代码时,我得到的是一个包含黑色、灰色和白色(!)点的散点矩阵,这妨碍了可视化。网格似乎也不一致,只有靠近坐标轴的图才有相应的网格。我想要一个漂亮的网格和散点矩阵,遵循sns默认的配色方案(蓝色、绿色、红色)。
为什么seaborn绘图风格和使用pd.scatter_matrix()会执行不同(可怕的!)颜色配色方案,而不是散点图的默认配色方案和不一致的网格线?我该如何解决这些可视化问题?
我已经将seaborn更新到了相当新的版本(2017年7月的0.8版)。同时还尝试了非弃用版本的pandas pd.plotting.scatter_matrix(),但没有成功。如果我使用'ggplot'样式,散点图的配色方案是正确的,但网格仍然不一致。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('seaborn')
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target
df = pd.DataFrame(X, columns = iris.feature_names)

pd.scatter_matrix(df, c=y, figsize = [8,8],
                      s=80, marker = 'D');

enter image description here

软件包版本:

pandas 版本:0.20.1
matplotlib 版本:2.0.2
seaborn 版本:0.8.0


1
我猜pandas的散点矩阵在样式方面不是最好的选择。你是否知道seaborn的paigrid - ImportanceOfBeingErnest
我之前不知道这个,谢谢你指出来。这比使用pandas的解决方案好多了。从现在开始我会使用pairgrid。Python的可视化领域似乎充满了陷阱... - Frâncio Rodrigues
@franciobr,您能否澄清一下您的问题是什么?是默认/ seaborn matplotlib的美学问题还是其他问题? - Sergey Bushmanov
@SergeyBushmanovm 感谢您的帮助。这个图看起来很糟糕,与 seaborn 的默认美学完全不同。我不知道散点图从哪个调色板获取黑色/灰色/白色的点。它不是来自默认的 seaborn(蓝色、绿色、红色)或 matplotlib 调色板,而且网格线有问题。我希望有人能指出我在使用 pd.scatter_matrix() 方面的错误,但我想要的是 pd.scatter_matrix 搞砸了图表的样式,应该使用其他函数,如 sns.pairgrid。 - Frâncio Rodrigues
2个回答

7

我不确定这是否回答了你的问题,但你可以使用pairplot。让我知道吧。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target
df = pd.DataFrame(X, columns = iris.feature_names)

pd.plotting.scatter_matrix(df, c=y, figsize = [8,8],
                      s=80, marker = 'D');
df['y'] = y

sns.pairplot(df,hue='y')

你将得到以下内容:

enter image description here

如果您想避免可视化的最后一行,则可以:
import seaborn as sns
sns.set(style="ticks", color_codes=True)
iris = sns.load_dataset("iris")
%matplotlib inline

iris = sns.load_dataset("iris")
sns.pairplot(iris, hue="species")

enter image description here


感谢您的帮助。从语法和可视化角度来看,这些seaborn函数比pandas要好得多。[seaborn.pairgrid](http://seaborn.pydata.org/generated/seaborn.PairGrid.html)(由@ImportanceOfBeingErnest评论)及其更高级别的对应项[seaborn.pairplot](http://seaborn.pydata.org/generated/seaborn.pairplot.html)是解决我的问题的好方法。 - Frâncio Rodrigues

2
matplotlib的默认设置并不太美观;然而,不要低估matplotlib的强大功能。
解决您问题最简单的方法可能是:
plt.style.use('ggplot') # this is the trick

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target
df = pd.DataFrame(X, columns = iris.feature_names)

pd.scatter_matrix(df, c=y, figsize = [10,10], s=50);

这里输入图片描述

(可以通过plt.style.available访问可用的样式列表)

您可以进一步自定义图形以满足您的需求,调整matplotlibrc文件。有关如何使用它的示例可以在此处找到。


谢谢您的回答,但我之前已经尝试过这个方法了,正如原问题中图下方段落所述。'ggplot'风格仍然会产生不一致的网格线。忽略pandas并使用seaborn的pairgrid函数似乎是更简单的解决方法。我应该让我已经尝试过的部分更加明显,我将编辑问题以便更容易看到它。 - Frâncio Rodrigues
如何根据类别获取直方图/密度图?也就是说,我们如何为其获取不同的颜色? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接