(Как) я могу применить функцию морского ежа для отдельных участков? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь нанести выборку сюжетов типа «ящик с усами» с видимой осью y только на графиках слева.Я делаю циклы данных для панд, чтобы сделать это.Однако функция despine, которую я использую для удаления осей, по-видимому, применяется ко всем графикам, когда бы она ни использовалась.В этом случае конечный участок не должен иметь оси y, но ось также удаляется из графиков с левой стороны.Есть ли способ обойти это?

Можно ли изолировать каждый участок от функции деспина, примененной к другим?Это, кажется, происходит только для функции despine.Текущий код приведен ниже, но я также попытался создать определенные оси как до цикла (используя [fig, axes = plt.subplots (ncols = 3, nrows = 4)]), так и внутри цикла (ax = plt.subplot (4,3, q + 1), затем пытается вызвать ax = ax в функциях построения морского побережья).

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

sns.set(rc={"figure.figsize":(10,20)}, font_scale=1) # set size of plots and font
sns.set_style("ticks", {"font.sans-serif": "Arial"}) # set style for plots
sns.set_palette("cubehelix", n_colors=len(participants)) # set colour palette for individual datapoints

plt.figure
for q in range(11):
    plt.subplot(4,3,q+1)
    qplot = sns.swarmplot(data=eval("s" + str(q+1)), x="variable", y="value", hue="Participant", size=3) # plot individual participant data as points
    qplot.legend().set_visible(False) # hide the legend for individual participant data
    qplot = sns.boxplot(data=eval("s" + str(q+1)), x="variable", y="value", palette="Greys", linewidth=2, fliersize=0, width=0.85) # plot the boxplot
    qplot.set(ylim=(-3.5,3.5), xlabel="Condition", ylabel="Response") # set y axis values and label axes
    plt.title("S" + str(q+1)) # add a title
    if (q == 0) or (q == 3) or (q == 6):
        qplot.set(xticklabels=[], xlabel=None, xticks = []) # remove ticks and labels
        sns.despine(bottom = True, top=True, right=True, left=False, trim=True) # remove spines 
    if (q == 1) or (q == 2) or (q == 4) or (q == 5) or (q == 7):
        qplot.set(xticklabels=[], xlabel=None, xticks = [], yticklabels=[], ylabel = None, yticks = []) # remove ticks and labels
        sns.despine(bottom = True, top=True, right=True, left=True, trim=True) # remove spines
    if (q == 9):
        sns.despine(top=True, right = True,trim=True) # remove spines
    if (q == 8) or (q == 10):
        qplot.set(yticks = [], yticklabels=[], ylabel = None) # remove ticks and labels
        sns.despine(bottom=True, top=True, left=True, right=True, trim=True) # remove spines
    for axis in ["top","bottom","left","right"]: 
        qplot.spines[axis].set_linewidth(2) # set linewidth of axes
        qplot.tick_params(axis = "x", width=0) # set linewidth of x ticks to zero
        qplot.tick_params(axis = "y", width=2) # set linewidth of y ticks

Figure output

1 Ответ

0 голосов
/ 03 июня 2019

Для будущих ищущих ответов, которые могут наткнуться на этот вопрос, вы можете сделать что-то вроде следующего, чтобы показать / скрыть шипы в сетке осей, используя sns.despine():

fig, axs = plt.subplots(4,3)
for ax in axs.flat:
    if ax.is_first_col():
        if ax.is_last_row():
            sns.despine(bottom=False, left=False, ax=ax)
        else:
            sns.despine(bottom=True, left=False, ax=ax)
    elif ax.is_last_row():
        sns.despine(bottom=False, left=True, ax=ax)
    else:
        sns.despine(bottom=True, left=True, ax=ax)

enter image description here

@ PaulH был достаточно любезен, чтобы изменить код выше. Его версия намного компактнее и легче для чтения:

fig, axs = plt.subplots(4,3)
for ax in axs.flat:
    sns.despine(bottom=not ax.is_last_row(), left=not ax.is_first_col(), ax=ax)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...