Matplotlib / Seaborn shareX создает неправильные x-метки для всех вспомогательных участков со строковыми значениями оси x - PullRequest
0 голосов
/ 13 октября 2018

Я создаю графики подзаговоров, используя цикл for, и когда я включаю «sharex», x-метки для всех подзаговоров неверны и соответствуют последним подзаговорам.Я хочу создать галочку для каждого доступного ярлыка.

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


df = pd.DataFrame({
     'letters' : ['A','A','A', 'B','B','B', 'C','C','C', 'D','D','D'],
     'values' : [1, 2, 3, 3, 2, 1, 2, 3, 1, 2, 3, 4],
     'options': ['O 1', 'O 2', 'O 3', 'O 3', 'O 2', 'O 1',
                 'O 2','O 3','O 1','O 2','O 3','O 4'],
                 })

list_letters = ['A', 'B', 'C', 'D']

fig,axes = plt.subplots(nrows = 1, ncols = len(list_letters), sharey = True, sharex = True)
for letter in list_letters:
    index = list_letters.index(letter)
    df2 = df[(df['letters'] == letter)]
    sns.scatterplot(x="options", y="values",data = df2,
              hue = 'options', ax=axes[index], legend = False)

    axes[index].set_title(letter, rotation = 60, verticalalignment = 'bottom', ha = 'left')

Я специально создал фрейм данных, чтобы в варианте O1 для всех «букв» было значение 1.То же самое для O2, O3 и O4.

При отключенном shareX (False):
With shareX turned off

При включенном shareX (True):
With shareX turned on

Обратите внимание, что значения не соответствуют корректно опциям, есть только 3 метки, и все вспомогательные участки соответствуют последнему порядку подпрограмм, когда shareX был выключен.

Это проблемасо струнными осями X.Если я изменю столбец «options» на числовые значения, все работает нормально.Смотрите здесь:
integer x axes values

Есть ли какой-либо способ создать подзаголовки с помощью циклов for, включить ShareX и иметь четыре метки, O1, O2,O3, O4, и все значения правильно совпадают?

1 Ответ

0 голосов
/ 13 октября 2018

К сожалению, в настоящее время нет способа заранее определить единицы измерения осей.Это усложняет построение нескольких категориальных наборов данных.
Один из хитроумных решений - построить что-то на осях в ожидаемом порядке и затем удалить его.Это делается с помощью функции prepare_axes в приведенном ниже коде.

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

df = pd.DataFrame({
     'letters' : ['A','A','A', 'B','B','B', 'C','C','C', 'D','D','D'],
     'values' : [1, 2, 3, 3, 2, 1, 2, 3, 1, 2, 3, 4],
     'options': ['O 1', 'O 2', 'O 3', 'O 3', 'O 2', 'O 1',
                 'O 2','O 3','O 1','O 2','O 3','O 4'],
                 })

list_letters = ['A', 'B', 'C', 'D']

def prepare_axes(x, ax):
    ax.autoscale(False)
    line, = ax.plot(x, np.zeros(len(x)))
    line.remove()
    ax.relim()
    ax.autoscale(True)

# determine all needed categoricals        
uniqueoptions = df["options"].unique()

fig,axes = plt.subplots(nrows = 1, ncols = len(list_letters), sharey = True, sharex = True)
for letter in list_letters:
    index = list_letters.index(letter)
    df2 = df[(df['letters'] == letter)]
    _, hue = np.unique(df2["options"].values, return_inverse=True)
    prepare_axes(uniqueoptions, axes[index])
    axes[index].scatter(x="options", y="values", c=hue, data = df2)

    axes[index].set_title(letter, rotation = 60, verticalalignment = 'bottom', ha = 'left')

plt.show()

enter image description here

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