Общая категориальная ось Y на Matplotlib - PullRequest
0 голосов
/ 23 декабря 2018

Я попробовал нижеприведенное, но это дает неправильные результаты - метки Y субплота 1 неправильно заменяются метками Y субплота 2.

import pandas as pd
import matplotlib.pyplot as plt

ab = {
   'a': ['a','b','a','b'],
   'b': [1,2,3,4]
}
ab = pd.DataFrame(ab)

cd = {
   'c': ['e','e','f','d'],
   'd': [1,2,3,4]
}
cd = pd.DataFrame(cd)


fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)
axs[0].scatter(
   ab['b'], 
   ab['a']
)
axs[1].scatter(
   cd['d'],
   cd['c']
)

enter image description here

Правильный результат должен иметь все буквы - a, b, d, e, f на оси Y, предпочтительно по порядку, и точки точечной диаграммы расположены правильно.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Поскольку категории по оси y не совпадают, это происходит.Я проверил, работают ли они, если значения категорий («а» и т. Д.) Одинаковы в обоих кадрах.На странице руководства matplotlib подплота

Когда субплоты имеют общую ось x вдоль столбца, создаются только метки x нижнего подплота.Точно так же, когда субплоты имеют общую ось Y вдоль строки, создаются только метки y первого подплота столбца.

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

0 голосов
/ 23 июля 2019

Вы можете обмануть ось, чтобы построить числовые значения и изменить метки вручную:

# Imports and data

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

ab = {
   'a': ['a','b','a','b'],
   'b': [1,2,3,4]
}
ab = pd.DataFrame(ab)

cd = {
   'c': ['e','e','f','d'],
   'd': [1,2,3,4]
}
cd = pd.DataFrame(cd)

# from categorical to numerical
idx = {j:i for i,j in enumerate(np.unique(list(ab['a']) + list(cd['c'])))}

fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)

# correct ticks
axs[0].set_yticks(range(len(idx)))
axs[0].set_yticklabels(idx.keys())

axs[0].scatter(
   ab['b'], 
   [idx[i] for i in ab['a']] # plot numerical
)
axs[1].scatter(
   cd['d'],
   [idx[i] for i in cd['c']] # plot numerical
)

plt.show()

Результирующий график:

enter image description here

0 голосов
/ 23 декабря 2018

Если значения столбцов a и c являются уникальными, возможно reindex путем объединения обоих:

cats = np.union1d(ab['a'], cd['c'])
ab = ab.set_index('a').reindex(cats)
cd = cd.set_index('c').reindex(cats)

и затем построить вместо столбцов index es:

# print(dfFormationSets4.head())
fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)
axs[0].scatter(
   ab['b'], 
   ab.index
)
axs[1].scatter(
   cd['d'],
   cd.index
)

Если необходимы не уникальные значения, используйте numpy.setdiff1d с append и sort_values для добавления отсутствующих категорий:

ab = {
   'a': ['a','b','a','b'],
   'b': [1,2,3,4]
}
ab = pd.DataFrame(ab)

cd = {
   'c': ['e','e','f','d'],
   'd': [1,2,3,4]
}
cd = pd.DataFrame(cd)

cats = np.union1d(ab['a'], cd['c'])
print (cats)
['a' 'b' 'd' 'e' 'f']

ab1 = pd.DataFrame({'a': np.setdiff1d(cats, ab['a'].unique())})
ab = ab.append(ab1, ignore_index=True).sort_values('a')
print (ab)
   a    b
0  a  1.0
2  a  3.0
1  b  2.0
3  b  4.0
4  d  NaN
5  e  NaN
6  f  NaN

cd1 = pd.DataFrame({'c': np.setdiff1d(cats, cd['c'].unique())})
cd = cd.append(cd1, ignore_index=True).sort_values('c')
print (cd)
   c    d
4  a  NaN
5  b  NaN
3  d  4.0
0  e  1.0
1  e  2.0
2  f  3.0

fig, axs = plt.subplots(
   1, 2,
   figsize = (15, 5), 
   sharey = True,
   sharex = True
)
axs[0].scatter(
   ab['b'], 
   ab['a']
)
axs[1].scatter(
   cd['d'],
   cd['c']
)

graph

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