Установка столбцов DataFrame в качестве строк фигуры FacetGrid

У меня есть набор панельных данных по странам с несколькими показателями для каждого года наблюдения за страной. Для простоты я привожу здесь только два показателя: выбросы парниковых газов и выбросы в атмосферу.

rs = np.random.RandomState(4)
pos = rs.randint(-1, 2, (4, 5)).cumsum(axis=1)
pos -= pos[:, 0, np.newaxis]
pos2 = rs.randint(-4, 3, (4, 5)).cumsum(axis=1)
pos2 -= pos[:, 0, np.newaxis]
year = np.tile(range(5), 4)
walk = np.repeat(range(4), 5)

df = pd.DataFrame(np.c_[pos.flat, pos2.flat, year, walk],
                  columns=["Air emissions", 'GHG', "year", "Country ID"])

Я хочу разработать визуализацию, показывающую тенденцию для каждого показателя в каждом году страны. Каждый индикатор отображается в строке, а страны — это мои столбцы. До сих пор это то, что я сделал для одного индикатора - Выбросы в атмосферу - но я хотел бы также показать тенденцию ПГ (и другие индикаторы, не указанные здесь) и добавить их в виде строки ниже Выбросы в атмосферу: как?

sns.set(style="ticks")

    # Initialize a grid of plots with an Axes for each walk
grid = sns.FacetGrid(df, col="Country ID", hue="year", palette="tab20c",
                         col_wrap=4, height=3)

    # Draw a line plot to show the trajectory of each random walk
grid.map(plt.plot, "year", "Air emissions",  marker="o")

    # Adjust the arrangement of the plots
grid.fig.tight_layout(w_pad=1)

как мне это сделать? Зацикливание? Но не перезапишет ли это графики?

Благодарность!


person Filippo Sebastio    schedule 13.06.2019    source источник
comment
Я не знаю, где у вас данные по выбросам парниковых газов. Это столбец 'Other'?   -  person busybear    schedule 13.06.2019
comment
да, извините, поправил!   -  person Filippo Sebastio    schedule 13.06.2019


Ответы (1)


Вы захотите закодировать нужные переменные в строках FacetGrid в виде столбца с отдельным столбцом, содержащим значения для каждой переменной. Вероятно, не самое лучшее объяснение, но оно будет выглядеть так:

    year  Country ID       variable  value
0      0           0  Air emissions      0
1      0           0            GHG      0
2      0           1  Air emissions      0
3      0           1            GHG     -3
4      0           2  Air emissions      0
5      0           2            GHG     -2
...

Затем вы можете установить для параметра FacetGrid row значение 'variable' (вам также придется удалить col_wrap):

grid = sns.FacetGrid(x, row='variable', col="Country ID", hue="year", palette="tab20c", height=3)
grid.map(plt.plot, "year", "value",  marker="o")

Вы можете переформатировать свой фрейм данных, используя pivot_table:

df = df.pivot_table(index=['year', 'Country ID'], values=['Air emissions', 'GHG']).stack().reset_index()
df.columns = ['year', 'Country ID', 'variable', 'value']
person busybear    schedule 13.06.2019
comment
Спасибо, вы знаете, как я могу поместить название нарушения по оси Y для каждой строки, а не в качестве заголовка? Название нарушения и страна перекрываются и прочитать четко не представляется возможным.. - person Filippo Sebastio; 13.06.2019
comment
Вы можете получить доступ к каждой оси с помощью grid.axes[i, j]. При этом вы можете использовать свои обычные set_ylabel и set_title для изменения этих значений. Вы можете явно задать порядок строк для FacetGrid с помощью row_order, чтобы точно знать, какую переменную представляет каждая строка. - person busybear; 13.06.2019