Python Pandas Seaborn FacetGrid:使用数据框系列的名称来设置列

Python Pandas Seaborn FacetGrid: use dataframe series' names to set up columns

我正在使用 pandas 数据框来保存一些体积计算结果,并尝试配置一个 seaborn FacetGrid 设置来可视化一个水库区域的 4 种不同类型的体积计算结果。

我相信我可以处理数据框部分,我的问题是可视化部分: 每种不同类型的体积计算都作为一个系列加载到数据框中。系列名称对应于体积计算的类型。然后我想创建一些图,对齐以便图的每一列对应于我的数据框中的一个系列。

理论(文档)说应该这样做(示例来自 https://seaborn.pydata.org/tutorial/axis_grids.html):

import seaborn as sns
import matpltlib.pyplot as plt
tips = sns.load_dataset("tips")
g=sns.FacetGrid(tips, col = "time")

我找不到要下载的参考数据集"tips",但我认为这是一个小问题。从上面的代码片段和对我自己的数据进行一些测试后,我推断该数据集中的 "time" 指的是数据框中 one series 的名称,并且不同的时间会然后是该系列中的不同类别或其他类型的值。

这不是我的数据集的排序方式。我有不同类型的体积计算,我将它们视为在我的数据框中表示为系列的单个图(在列中)。如何提供系列名称作为 seaborn FacetGrid col= 参数的输入?

g = seaborn.FacetGrid(data=volumes_table, col=?????)

我不知道如何获得 col=dataframe.series,也找不到任何相关的文档示例。

这是一个包含一些令人兴奋的虚拟名称和虚拟值的设置

import os
import pandas
import numpy
import seaborn
import matplotlib.pyplot as plt

#provide some input data, using a small dictionary
volumes_categories = {'zone_numbers': [1, 2, 3, 4],
 'zone_names': ['corona', 'hiv', 'h5n1', 'measles'],
 'grv': [30, 90, 80, 100],
 'nv': [20, 60, 20, 50],
 'pv': [5, 12, 4, 25],
 'hcpv': [4, 6, 1, 20]}

# create the  dataframe
volumes_table = pandas.DataFrame(volumes_categories)

# set up for plotting
seaborn.set(style='ticks')
g= seaborn.FacetGrid(data=volumes_table, col='zone_names')

上面的设置可以生成列,但是我无法让列来表示我的数据框中的系列(将数据框可视化为 table 时的列)

我需要做什么?

一旦我们导入了所有需求:

import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')

FacetGrid 本质上只是提供了一个 canvas 来绘制。然后,您可以使用 map 函数 "project" 将函数绘制到 canvas:

# Blueprint
g = sns.FacetGrid(dataframe, col="dataframe.column", row="dataframe.column")
g = g.map(plotting.function, "dataframe.column")

# Example with the tips dataset
g = sns.FacetGrid(tips, col="time", row="smoker")
g = g.map(plt.hist, "total_bill")
plt.show()

在你上面提到的情况下,我也会先融化列以获得整洁的数据格式,然后像往常一样绘制。根据需要更改要绘制的内容:

volumes_table = volumes_table.melt(id_vars=['zone_numbers', 'zone_names'])
g = sns.FacetGrid(data=volumes_table, col='variable')
g = g.map(plt.scatter, 'zone_numbers', 'value')
plt.show()

解决方案的主要部分在 BBQuercus 的回答中有所描述:将漂亮的、人类可读的宽格式 dataframe/table 重塑为长格式 table,这对于 seaborn 来说更容易消化,使用 seaborn.melt()

我通过创建原始数据框的副本并熔化副本来实现这一点:

# first copy dataframe
vol_table2 = volumes_table.copy()

#melt it into long format
vol_table2 = pandas.melt(vol_table2, id_vars = ['zone_numbers','zone_names'], value_vars=['grv','nv','pv','hcpv'], var_name = "volume_type", value_name = "volume")

最后我还决定放弃明确的 FacetGrid 和地图设置并使用 seaborn.catplot(包括 FacetGrid 功能)。

感谢帮助 (PS:seaborn 接受 Facetgrid 设置的系列名称一定是个好主意)