【问题标题】:R Lattice like plots with Python, Pandas and MatplotlibR Lattice 使用 Python、Pandas 和 Matplotlib 绘制类似图
【发布时间】:2014-09-14 06:10:53
【问题描述】:

我有一个包含“因子”、浮点数和整数的 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 格代码示例)

每级 c1 的 x1 与 x2(格子代码)

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(我把它们弄乱了 - 发现它们也令人沮丧和限制)。

谢谢! 兰德尔

【问题讨论】:

  • 在 pandas 中有一些用于格状图的实验代码:pandas.pydata.org/pandas-docs/stable/rplot.html。那会有帮助吗?另请参阅ggplot.yhathq.com,它类似于 R 中的 ggplot,它支持分面网格。
  • 您能否为等高线图问题添加一些示例。 Seaborn 具有 hexbins 和 2 维 kde 图的功能,我认为这可以满足您的需求。

标签: python r matplotlib pandas lattice


【解决方案1】:

Seaborn 是我发现的用于在 python 中绘制分面图的最有效的库。 它是一个围绕 matplotlib 的熊猫感知包装器,它为您处理所有子图并更新 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)

【讨论】:

  • 这很好,但只是想指出,使用lmplot 函数可以更轻松地实现其中一些图。您可以使用sns.lmplot("x1", "x2", col="c2", data=df) 制作第一个。这也适合回归线,可能有用也可能没用,但可以通过添加 fit_reg=False 来禁用。
  • 非常感谢您的回答。我确实花了一些时间浏览 seaborn 教程(和代码),并将其称为已回答。不过,我还是有点想念 R Lattice。在 seaborn / pandas 中,调节和分组似乎不像 R Lattice 公式界面那样“自然”。我也习惯于处理长格式而不是宽格式的数据(尽管我看到许多 sns 绘图函数都接受这两种格式)。我确实认为您的描述会帮助我理解并开始更多地利用它。
猜你喜欢
  • 2017-12-12
  • 2015-09-10
  • 2014-07-27
  • 2020-10-25
  • 2017-04-11
  • 1970-01-01
  • 2018-02-24
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多