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

Posted

技术标签:

【中文标题】Seaborn 和 pd.scatter_matrix() 绘图颜色问题【英文标题】:Seaborn and pd.scatter_matrix() plot color issues 【发布时间】:2018-03-05 03:36:37 【问题描述】:

我正在根据由目标变量(植物物种)着色的 Iris 数据集从 DataFrame 制作 pd.scatter_matrix() 图。当我运行下面的代码时,我得到一个带有黑色、灰色和白色(!)彩色散射点的散射矩阵,这阻碍了可视化。网格似乎也不一致,显然只有靠近轴的图才能获得相应的网格。我想要一个遵循 sns 默认调色板(蓝色、绿色、红色)的漂亮网格和散点矩阵。

为什么 seaborn 绘图风格和 pd.scatter_matrix() 的使用强制执行不同的(可怕的!)调色板,然后散点图和不一致的网格线的默认值?如何解决这些可视化问题?

我已经将 seaborn 更新到了相当新的版本(2017 年 7 月的 0.8)。还尝试了熊猫 pd.plotting.scatter_matrix() 的 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');

软件包版本:

熊猫版本:0.20.1 matplotlib 版本:2.0.2 seaborn 版本:0.8.0

【问题讨论】:

我猜熊猫散布矩阵在样式方面不是最佳选择。你知道seaborn's paigrid吗? 我不是。感谢您指出它比熊猫解决方案要好得多。从现在开始我将使用pairgrid。 Python 可视化领域似乎充满了陷阱…… @franciobr 请您澄清一下您的问题到底是什么?默认/seaborn matplotlib 的美学还是别的什么? @SergeyBushmanovm 感谢您的帮助。情节看起来很糟糕,与seaborn的默认美学完全不同。我不知道散点图从哪个调色板中得到黑色/灰色/白色点。它不是来自默认的 seaborn(蓝色、绿色、红色)或 matplotlib 调色板,并且网格线有问题。我希望有人能在我使用 pd.scatter_matrix() 的方式上指出一些错误,但我想外卖是 pd.scatter_matrix 搞砸了绘图的风格,应该使用其他功能,例如 sns.pairgrid 代替。 【参考方案1】:

默认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 文件。 here

【讨论】:

感谢您的回答,但我之前实际上已经尝试过,如原始问题中图下方的段落所述。 'ggplot' 样式仍然给出不一致的网格线。忽略 pandas 并使用 seaborn 的 pairgrid 函数似乎是更简单的方法。我应该让我已经尝试过的段落更加明显,我将编辑问题以便更容易看到它。【参考方案2】:

我不确定这是否能回答您的问题,但您可以使用 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')

给你:

如果你想避免可视化的最后一行,那么:

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")

【讨论】:

感谢您的帮助。从语法和可视化的角度来看,这些 seaborn 函数比 pandas 优越得多。 seaborn.pairgrid(由@ImportanceOfBeingErnest 评论)及其更高级别的对应物seaborn.pairplot 是解决我问题的好方法。

以上是关于Seaborn 和 pd.scatter_matrix() 绘图颜色问题的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 matplotlib 和 seaborn 热图?

seaborn使用(样式管理)

Seaborn 色调和尺寸图例

在图例中使用不同的颜色和形状 [Seaborn,Python]

Pandas 重新采样和箱线图(seaborn)

如何为图形级功能编辑 seaborn 图例标题和标签