Можем ли мы отсортировать ось x на графике Python после ее построения? - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь построить два столбца из двух разных фреймов данных в одном графике. Я выяснил код, чтобы построить его в одном, но ось х должна быть в порядке возрастания. Можем ли мы сделать это в этом случае?

df1=pd.DataFrame({ 'ID': ['A1','A2','A6','A7','A9'], 'F1_S': [23,75,42,77,54] },
                 columns=['ID', 'F1_S'])
df2=pd.DataFrame({ 'ID': ['A3','A4','A5','A8'], 'F1_S': [66,43,56,86] },
                 columns=['ID', 'F1_S'])
x1 = list(df1['ID'])
y1= list(df1['F1_S'])
lists1 = sorted(zip(*[x, y1]))
x1, y1 = zip(*sorted(zip(x1, y1)))

x2 = list(df2['ID'])
y2= list(df2['F1_S'])
lists2 = sorted(zip(*[x2, y2]))
x2, y2 = zip(*sorted(zip(x2, y2)))

plt.plot (x1,y1)
plt.plot(x2,y2)

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Не уверен, что это именно то, что вам нужно, но здесь идет речь:

import pandas as pd
import matplotlib.pyplot as plt


df1 = pd.DataFrame({'ID': ['A1', 'A2', 'A6', 'A7', 'A9'],
                    'F1_S': [23, 75, 42, 77, 54]},
                   columns=['ID', 'F1_S'])
df2 = pd.DataFrame({'ID': ['A3', 'A4', 'A5', 'A8'],
                    'F1_S': [66, 43, 56, 86]},
                   columns=['ID', 'F1_S'])

df1.set_index('ID', inplace=True)
df1.index.name = None
df1.columns = ['F1_S_1']
df2.set_index('ID', inplace=True)
df2.index.name = None
df2.columns = ['F1_S_2']
df = pd.concat([df1, df2], sort=True).sort_index().interpolate(limit_area='inside')
ax = df.plot()
ax.set_xticklabels(['A0'] + df.index.tolist())
plt.show()

Результат таков:

enter image description here

* Похоже, что с 1011 * произошла ошибка с маркировкой оси, мне пришлось взломать поддельный элемент в списке xlabel, чтобы он отображался правильно.

0 голосов
/ 06 сентября 2018

Одним из возможных решений является построение объединенного кадра данных по числовому индексу и установка отметок для категорий.

import matplotlib.pyplot as plt
import pandas as pd

df1=pd.DataFrame({ 'ID': ['A1','A2','A6','A7','A9'], 'F1_S': [23,75,42,77,54] },
                 columns=['ID', 'F1_S'])
df2=pd.DataFrame({ 'ID': ['A3','A4','A5','A8'], 'F1_S': [66,43,56,86] },
                 columns=['ID', 'F1_S'])
# Rename the column of one of the dataframe
df2 = df2.rename(columns={'F1_S' : 'F2_S'})
# Concatenate dataframes, reset the index (such that it will be numeric)
df3 = pd.concat([df1.set_index("ID"), df2.set_index("ID")], sort=True).sort_index().reset_index()

#Plot each column without nan values, against the numeric index
plt.plot(df3["F1_S"].dropna())
plt.plot(df3["F2_S"].dropna())
# Set labels to category names
plt.xticks(range(len(df3)), df3["ID"])
plt.show()

enter image description here

0 голосов
/ 06 сентября 2018

Почему бы просто не объединить два?

pd.concat([df1[['ID', 'F1_S']], df2[['ID', 'F1_S']])\
  .sort_values(by='ID')\
  .plot(x='ID', y='F1_S')

Редактировать: чтобы сделать их отдельными линиями, построенными на одной оси:

fig, ax = plt.subplots()
df1.sort_values(by='ID')\
   .plot(x='ID', y='F1_S', ax=ax)
df2.sort_values(by='ID')\
   .plot(x='ID', y='F1_S', ax=ax)

Вызов df.plot принимает те же kwargs, что и plt.plot, поэтому вы можете указать разные цвета для каждого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...