Совместное использование Matplotlib для данных с разными значениями x?

#python #python-3.x #pandas #matplotlib #seaborn

#python #python-3.x #панды #matplotlib #сиборн

Вопрос:

Как я могу изменить приведенный ниже код, чтобы график охватывал все 6 значений оси x и имел только пустые места в A, C, F для столбцов df2?

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'x':['A','B','C','D','E','F'],'y1':np.random.rand(6)})
df2 = pd.DataFrame({'x':['B','D','E'],'y2':np.random.rand(3)})

fig,axes = plt.subplots(2, sharex='all')

sns.barplot(x='x',y='y1',data=df,ax=axes[0])
sns.barplot(x='x',y='y2',data=df2,ax=axes[1])
  

введите описание изображения здесь

Ответ №1:

order Аргумент Сиборна может принимать список, который может содержать значения, которых нет в данных. Таким образом, вы можете указать уникальные значения из столбцов x.

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'x':['A','B','C','D','E','F'],'y1':np.random.rand(6)})
df2 = pd.DataFrame({'x':['B','D','E'],'y2':np.random.rand(3)})

order = np.unique(list(df.x) list(df2.x))

fig,axes = plt.subplots(2, sharex='all')

sns.barplot(x='x',y='y1',data=df,ax=axes[0], order=order)
sns.barplot(x='x',y='y2',data=df2,ax=axes[1], order=order)

plt.show()
  

введите описание изображения здесь

Ответ №2:

В matplotlib одиночку это можно сделать, объединив два фрейма данных:

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

fig, axes = plt.subplots(2, sharex='all')

ax1, ax2 = axes

df = pd.DataFrame({'x': ['A', 'B', 'C', 'D', 'E', 'F'], 'y1': np.arange(6)})
df2 = pd.DataFrame({'x': ['B', 'D', 'E'], 'y2': np.random.rand(3)})

combined = df.merge(df2, how='left', on='x')

ax1.bar(combined['x'], combined['y1'])
ax2.bar(combined['x'], combined['y2'])
  

введите описание изображения здесь

Комментарии:

1. Я попробовал это со своими собственными данными и все еще испытываю проблемы, потому что NAN — это начало. Если вы измените df в примере на 'y1': [np.nan, np.nan] list(np.arange(4)) то, позиция «A» на оси x по-прежнему будет отсутствовать. Есть идеи, как это исправить? Другой ответ в итоге не сработал для меня, так как мне также нужно делать линейные графики