Пользовательская сортировка таблиц Python по оси X - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь создать график сводной таблицы, в котором ось X настроена пользователем.Мой код:

import pandas as pd
data_dict = {
    'x' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
    'y' : [9,10,11,12,13,14,15,1,2,3,4,5,6,7,8]
}
res_table = pd.DataFrame(data_dict)

df_pivot = pd.pivot_table(res_table, 
                    index='x', values='y', 
                    aggfunc='sum')

ax = df_pivot.plot(kind='line', marker='*', title='y data')

ax.set(xlabel='x', ylabel='y')
ax.legend(bbox_to_anchor=(1,1), loc="upper left")
ax.figure

Этот код дает этот график:

graph

Теперь я хочу изменить ось X так, чтобыоно начинается с 8 до 15, а затем следует с 1 по 7. Таким образом, график становится прямой линией.

Я попробовал этот код: ( Сводная таблица Pandas Nested Sorting )

order = [8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6, 7]
pd.concat([res_table.loc[res_table['x'] == val, :].set_index(['x']) for val in order])

Но это, похоже, ничего не меняет.

* Редактировать: Конечно, я могу добавить дополнительный столбец с правильным индексом и построить график с использованием этого, но я бы предпочел, чтобы графикпоказать реальное значение x.

** Редактировать: Я отпраздновал немного раньше.В моем реальном коде есть дополнительные столбцы для отображения нескольких этих линий на одном графике

data_dict = {
    'x' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
    'y' : [9,10,11,12,13,14,15,1,2,3,4,5,6,7,8,29,30,31,32,33,34,35,21,22,23,24,25,26,27,28],
    'z' : [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
}
res_table = pd.DataFrame(data_dict)
df_pivot = pd.pivot_table(res_table, 
                    index='x', values='y', 
                    aggfunc='sum', columns='z')

cut_val = 8
tmp_df = pd.concat((df_pivot.loc[cut_val:], 
                     df_pivot.loc[:cut_val-1])).reset_index()
print(tmp_df)
fig, ax = plt.subplots()

ax.plot(tmp_df.index, tmp_df.y, '-o')
ticks = ax.get_xticks()
ax.set_xticklabels(tmp_df.loc[ticks, 'x'])
ax.figure

Код останавливается на этой строке с ключевой ошибкой в ​​tmp_df.y:

ax.plot(tmp_df.index, tmp_df.y, '-o')

Безстолбец аргумент код работает нормально

В исходном коде график выглядит следующим образом enter image description here

1 Ответ

1 голос
/ 04 июля 2019

На самом деле, в этом особом случае, мы можем сделать с sort_value и set_xticklabels

df_pivot = df_pivot.sort_values('y').reset_index()

fig, ax = plt.subplots()

ax.plot(df_pivot.index, df_pivot.y, '-o')
ticks = ax.get_xticks()
ax.set_xticklabels(df_pivot.loc[ticks, 'x'])
plt.show()

выход:

enter image description here

В общем, вы можете обойтись с concat, а затем set_xticklabels аналогичным образом

cut_val = 8
tmp_df = pd.concat((df_pivot.loc[cut_val:], 
                     df_pivot.loc[:cut_val-1])).reset_index()

fig, ax = plt.subplots()

ax.plot(tmp_df.index, tmp_df.y, '-o')
ticks = ax.get_xticks()
ax.set_xticklabels(tmp_df.loc[ticks, 'x'])
plt.show()

Для вашего обновленного фрейма данных tmp_df на самом деле имеет несколько других столбцов, отличных от y, из-за уникальных значений в z:

cut_val = 8
tmp_df = pd.concat((df_pivot.loc[cut_val:], 
                     df_pivot.loc[:cut_val-1])).reset_index()
fig, ax = plt.subplots()

tmp_df[df_pivot.columns].plot(ax=ax, marker='o')
ticks = ax.get_xticks()
ax.set_xticklabels(tmp_df.loc[ticks, 'x'])
plt.show()

Выход:

enter image description here

...