使用Python、Pandas和Matplotlib创建类似于R Lattice的图表

6

我有一个pandas数据框,其中包含“因子”(浮点数和整数)。我想使用分类变量的条件和分组来制作“R Lattice”类似的图。我经常使用R,并编写自定义面板函数,以便将图形格式化为我想要的样子,但是我在使用matplotlib时很难做到同样简洁地绘制这些图形。我正在尝试使用布局和subplot2grid,但似乎无法做到完美。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

nRows = 500
df = pd.DataFrame({'c1' : np.random.choice(['A','B','C','D'], size=nRows),
               'c2' : np.random.choice(['P','Q','R'], size=nRows),
               'i1' : np.random.randint(20,50, nRows),
               'i2' : np.random.randint(0,10, nRows),
               'x1' : 3 * np.random.randn(nRows) + 90,
               'x2' : 2 * np.random.randn(nRows) + 89})

我想绘制以下内容(R lattice代码示例):

c1的每个级别上,x1与x2的关系(lattice代码)

xyplot(x1 ~ x2 | c1, data = df)

在“全局”图例c2(符号或颜色)下,针对每个c1级别的x1与x2进行比较。
xyplot(x1 ~ x2 | c1, groups = c2, data = df)

每个c2的x1直方图

hist (~x1 | c1, data = df)

我也想制作类似于此处(1.4.4.4)生成的“有条件”的等高线图。

https://scipy-lectures.github.io/intro/matplotlib/matplotlib.html

我已经阅读了这些示例:

http://nbviewer.ipython.org/github/fonnesbeck/Bios366/blob/master/notebooks/Section2_4-Matplotlib.ipynb

然而,我希望布局是根据分类条件(或“按”变量)中的级数生成的。即指定列数,行数将基于级数计算。

感谢任何好的建议或正确方向的步骤。我不想使用rpy2或python ggplot(我尝试过它们-发现它们令人沮丧且限制太多)。

谢谢! Randall


pandas中有一些关于trellis plots的实验性代码:http://pandas.pydata.org/pandas-docs/stable/rplot.html。这对你有帮助吗?另请参考http://ggplot.yhathq.com/,它类似于R中的ggplot,支持facet grids。 - joris
你能为轮廓图问题添加一些例子吗? Seaborn具有六角形箱和二维kde图的功能,我认为这可以满足您的需求。 - b10n
1个回答

8

Seaborn是我在Python中发现的最有效的用于制作多面板绘图的库。它是matplotlib的一个pandas感知包装器,可以为您处理所有子图,并更新matplotlib样式以使其看起来更现代化。它可以产生一些非常美丽的输出。

使用该库的grid部分进行分面。与R不同的是,您需要先创建网格,然后将数据和所需的分面(行、列、颜色等)传递给它。然后,您可以将绘图函数映射到该网格上,并将任何必需的参数传递给映射的绘图函数。

#scatter plot one factor
import seaborn as sns
grid1 = sns.FacetGrid(df, col='c1')
grid1.map(plt.scatter, 'x1', 'x2')


#scatter plot with column and hue factor
grid2 = sns.FacetGrid(df, col='c1', hue='c2')
grid2.map(plt.scatter, 'x1', 'x2')


#histogram with one factor
grid3 = sns.FacetGrid(df, col='c1')
grid3.map(plt.hist, 'x1', alpha=.7)

1
这很棒,但是我想指出一些这些图可以使用lmplot函数更容易地实现。你可以用sns.lmplot("x1", "x2", col="c2", data=df)来制作第一个图。这也会拟合一个回归线,这可能有用,也可能没有用,但是可以通过添加fit_reg=False来禁用它。 - mwaskom
非常感谢您的回答。我确实花了一些时间运行seaborn教程(和代码),现在可以算是解决了。不过我还是有点想念R Lattice。在seaborn / pandas中,条件和分组似乎不像R Lattice公式界面那样“自然”。我也习惯于使用长格式的数据,而不是宽格式的数据(尽管我看到许多sns绘图函数都接受两种格式)。我认为您的描述将帮助我更好地理解并开始利用它。 - Randall Goodwin

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