Разделить вторичную ось Y на зацикленных участках морского побережья - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь построить несколько графиков со вторичной осью y в одной строке цикла.Я бы хотел, чтобы они имели только одну первичную ось y с левой стороны первого графика и только одну вторичную y с правой стороны последнего графика.До сих пор мне удавалось выполнить первое с помощью атрибута sharey = True для вспомогательных участков, но у меня возникли проблемы со вспомогательной осью.

for r in df.Category1.sort_values().unique():
    dfx = df[df['Category1'] == r]
    fig, axes = plt.subplots(1,3, figsize = (14,6), sharey=True)
    for (n, dfxx), ax in zip(dfx.groupby("Category2"), axes.flat): 
        ax1 = sns.barplot(x = dfxx['Month'], y = dfxx['value1'], hue = dfxx['Category3'], ci = None, palette = palette1, ax=ax)
        ax2 = ax1.twinx()
        ax2 = sns.pointplot(x = dfxx['Month'], y=dfxx['value2'], hue = dfxx['Category3'], ci = None, sort = False, legend = None, palette = palette2) 

plt.tight_layout()
plt.show()

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

Ответы [ 2 ]

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

в соответствии с этим ответом на аналогичный вопрос, вы можете использовать функцию get_shared_y_axes() осей вместе с ее join() методом:

fig, axes = plt.subplots(1,3, figsize = (14,6), sharey=True)

secaxes = []                            # list for collecting all secondary y-axes
for i, ax in enumerate(axes):
    ax.plot(range(10))
    secaxes.append(ax.twinx())          # put current secondary y-axis into list
    secaxes[-1].plot(range(10, 0, -1))
secaxes[0].get_shared_y_axes().join(*secaxes) # share all y-axes

for s in secaxes[:-1]:                  # make all secondary y-axes invisible
    s.get_yaxis().set_visible(False)    # except the last one

enter image description here

тест для общего масштабирования:

secaxes[1].plot(range(20, 10, -1))

enter image description here

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

Один простой способ получить то, что вы хотите, - это удерживать метки и галочки только на самой правой оси, отключив галочки первого и второго субплота.Это можно сделать с помощью индекса i следующим образом:

for r in df.Category1.sort_values().unique():
    dfx = df[df['Category1'] == r]
    fig, axes = plt.subplots(1,3, figsize = (14,6), sharey=True)
    i = 0 # <--- Initialize a counter
    for (n, dfxx), ax in zip(dfx.groupby("Category2"), axes.flat): 
        ax1 = sns.barplot(x = dfxx['Month'], y = dfxx['value1'], hue = dfxx['Category3'], ci = None, palette = palette1, ax=ax)
        ax2 = ax1.twinx()
        ax2 = sns.pointplot(x = dfxx['Month'], y=dfxx['value2'], hue = dfxx['Category3'], ci = None, sort = False, legend = None, palette = palette2) 
        if i < 2: # <-- Only turn off the ticks for the first two subplots
            ax2.get_yaxis().set_ticks([]) # <-- Hiding the ticks
        i += 1  # <-- Counter for the subplot
plt.tight_layout()

Но вы должны быть осторожны, чтобы ваши 3 субплота имели разные пределы y на вторичной оси.Поэтому лучше сделать границы осей равными, прежде чем скрывать галочки.Для этого вы можете использовать ax2.set_ylim(minimum, maximum), где минимум, максимум - это значения, которыми вы хотите ограничить ось.

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