Pandas scatter_matrix 中的类标签
Posted
技术标签:
【中文标题】Pandas scatter_matrix 中的类标签【英文标题】:class labels in Pandas scattermatrix 【发布时间】:2014-05-21 13:17:47 【问题描述】:之前有人问过这个问题,Multiple data in scatter matrix,但没有得到答案。
我想制作一个散点矩阵,类似于in the pandas docs,但针对不同的类别使用不同颜色的标记。例如,我希望根据其中一列(或单独列表)的值,一些点显示为绿色,而其他点显示为蓝色。
这是一个使用 Iris 数据集的示例。点的颜色代表鸢尾花的种类 -- Setosa、Versicolor 或 Virginica。
pandas(或 matplotlib)有办法制作这样的图表吗?
【问题讨论】:
查看 seaborn 项目:stanford.edu/~mwaskom/software/seaborn/tutorial/axis_grids.html(基于 pandas 和 matplotlib) @PaulH,感谢您的链接,这看起来非常有用。看起来我正在寻找的功能仍在开发中:github.com/mwaskom/seaborn/issues/63。 【参考方案1】:更新:此功能现在在最新版本的 Seaborn 中。 Here's an example.
以下是我的权宜之计:
def factor_scatter_matrix(df, factor, palette=None):
'''Create a scatter matrix of the variables in df, with differently colored
points depending on the value of df[factor].
inputs:
df: pandas.DataFrame containing the columns to be plotted, as well
as factor.
factor: string or pandas.Series. The column indicating which group
each row belongs to.
palette: A list of hex codes, at least as long as the number of groups.
If omitted, a predefined palette will be used, but it only includes
9 groups.
'''
import matplotlib.colors
import numpy as np
from pandas.tools.plotting import scatter_matrix
from scipy.stats import gaussian_kde
if isinstance(factor, basestring):
factor_name = factor #save off the name
factor = df[factor] #extract column
df = df.drop(factor_name,axis=1) # remove from df, so it
# doesn't get a row and col in the plot.
classes = list(set(factor))
if palette is None:
palette = ['#e41a1c', '#377eb8', '#4eae4b',
'#994fa1', '#ff8101', '#fdfc33',
'#a8572c', '#f482be', '#999999']
color_map = dict(zip(classes,palette))
if len(classes) > len(palette):
raise ValueError('''Too many groups for the number of colors provided.
We only have colors in the palette, but you have
groups.'''.format(len(palette), len(classes)))
colors = factor.apply(lambda group: color_map[group])
axarr = scatter_matrix(df,figsize=(10,10),marker='o',c=colors,diagonal=None)
for rc in xrange(len(df.columns)):
for group in classes:
y = df[factor == group].icol(rc).values
gkde = gaussian_kde(y)
ind = np.linspace(y.min(), y.max(), 1000)
axarr[rc][rc].plot(ind, gkde.evaluate(ind),c=color_map[group])
return axarr, color_map
作为示例,我们将使用与问题中相同的数据集,可用here
>>> import pandas as pd
>>> iris = pd.read_csv('iris.csv')
>>> axarr, color_map = factor_scatter_matrix(iris,'Name')
>>> color_map
'Iris-setosa': '#377eb8',
'Iris-versicolor': '#4eae4b',
'Iris-virginica': '#e41a1c'
希望这有帮助!
【讨论】:
如果有人通过搜索最终到达这里,从 seaborn 0.4 开始,这应该很容易。 Here's 一个基本的例子。【参考方案2】:您也可以从 pandas 中调用 scattermatrix,如下所示:
pd.scatter_matrix(df,color=colors)
colors
是大小为len(df)
的列表,包含颜色
【讨论】:
这在紧要关头起作用,但它不会沿主对角线按颜色分解直方图。这是它在我的机器上的样子:imgur.com/pJXgVpJ 对,那么你的解决方案更好。以上是关于Pandas scatter_matrix 中的类标签的主要内容,如果未能解决你的问题,请参考以下文章
pandas.scatter_matrix 函数开始绘制模糊和损坏的图
pandas绘制散点图矩阵 scatter_matrix函数报错问题
导入 pandas.plotting 以构建 scatter_matrix 时出现问题
使用 Pandas 和 Scatter_Matrix 将不会显示