【问题标题】:Python Pandas Seaborn FacetGrid: use dataframe series' names to set up columnsPython Pandas Seaborn FacetGrid:使用数据框系列的名称设置列
【发布时间】:2020-06-17 04:30:29
【问题描述】:

我正在使用 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")

我找不到要下载的引用数据集“提示”,但我认为这是一个小问题。从上面的代码 sn-p 和对我自己的数据进行一些测试后,我推断该数据集中的“时间”是指数据框中 一个系列的名称,不同的时间会有所不同该系列中的类别或其他类型的值。

这不是我的数据集的排序方式。我有不同类型的体积计算,我会在我的数据框中看到作为系列的单个图(在列中)。如何提供系列名称作为 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')

上述设置可以生成列,但我无法让这些列代表我的数据框中的系列(将数据框可视化为表格时的列......)

我需要做什么?

【问题讨论】:

  • IIUC,首先尝试将您的数据重组为长格式 - 查看melt。比如volumes_table.melt(id_vars=['zone_numbers', 'zone_names']),然后是g= seaborn.FacetGrid(data=volumes_table, col='variable')

标签: python pandas plot seaborn facet-grid


【解决方案1】:

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

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

FacetGrid 本质上只是提供了一个画布来绘制。然后,您可以使用 map 函数将绘图函数“投影”到画布上:

# 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()

【讨论】:

  • 感谢指出拼写错误,我更新了顶帖
  • 还没有,只是在下班前发布的,所以还没有时间让它工作。
【解决方案2】:

解决方案的主要部分在 BBQuercus 的回答中进行了描述:使用 seaborn.melt() 将漂亮的、人类可读的宽格式数据帧/表格重塑为更易于 seaborn 消化的长格式表格

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

# 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 设置的系列名称一定是个好主意)

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2012-08-25
    • 2017-12-03
    • 2016-12-31
    • 1970-01-01
    • 2019-06-18
    • 2014-10-06
    • 2017-08-23
    相关资源
    最近更新 更多