Python Pandas Seaborn FacetGrid: используйте имена рядов данных, чтобы установить столбцы - PullRequest
0 голосов
/ 04 марта 2020

Я использую pandas фреймы данных для хранения некоторых результатов расчета объема и пытаюсь настроить установку 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")

Я не могу найти "подсказки" для указанного набора данных для загрузки, но я думаю, что это небольшая проблема. Из приведенного выше фрагмента кода и после некоторого тестирования моих собственных данных я делаю вывод, что «время» в этом наборе данных относится к имени одна серия в кадре данных, и что разные времена будут разными категориями или другими типы значений в этой серии.

Это не тот порядок, в котором упорядочен мой набор данных. У меня есть различные типы вычислений объема, которые я видел бы как отдельные графики (в столбцах), представленные в виде ряда в моем фрейме данных. Как предоставить имя серии в качестве входного параметра для 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')

Приведенная выше настройка генерирует столбцы нормально, но я не могу получить столбцы для представления серии в моем фрейме данных (столбцы при визуализации фрейма данных в виде таблицы ....)

Что делать Мне нужно сделать?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Основная часть решения описана в ответе BBQuercus: преобразование удобного, удобочитаемого широкоформатного фрейма данных / таблицы в таблицу длинного формата, которую проще переварить для 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)

0 голосов
/ 04 марта 2020

После того, как мы импортировали все требования:

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

FacetGrid, по сути, просто предоставляет холст для рисования. Затем вы можете использовать функцию карты, чтобы «спроецировать» функции построения графика на холст:

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