Добавление нескольких подзаголовков pyplot.subplots - как? - PullRequest
0 голосов
/ 04 августа 2020

У меня вопрос, который очень похож, но не совсем такой, как этот и этот вопросы.

У меня 2 pyplot.subplots() генерирует fig и ax, и я хотел бы добавить последний к последней позиции первого fig.

import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({'a' :['one','one','two','two','one','two','one','one','one','two'], 'b': [1,2,1,2,1,2,1,2,1,1], 'c': [1,2,3,4,6,1,2,3,4,6]})


fig, ax = plt.subplots(ncols=3)
ax=ax.flatten()

for i in [0,1,2]:
    if(i<2):
        myvar=["b","c"][i]
        sns.boxplot( data=df,
            x='a', y=myvar, ax=ax[i])

### some other fig
fig2,ax2 = plt.subplots(figsize=(4,5))
g=sns.scatterplot(data=df, x='b', y='c')

### I have tried the following, but both of which return only the last figure generated
fig.axes.append(ax2) #
# or:
ax[2]=ax2

# I have also tried the following, but this returns an error:
#fig.add_axes(ax2)


plt.show() 

Изменить: Кроме того, можно ли было бы сделать это добавление, если последний фигура имеет несколько строк или столбцов?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Во втором ответе на первый вопрос, который вы связали (@ImportanceofBeingErnest), предлагается добавить существующую ось к другому рисунку, что невозможно в новых версиях matplotlib.

Как сказано в , ответе «оси не могут жить сразу несколькими цифрами». Поэтому вам нужно будет удалить его из одного и добавить к другому. Я бы подумал, что это больше хлопот, чем его ценность - вероятно, было бы лучше просто иметь функцию, которая принимает экземпляр осей в качестве входных данных для построения графика, затем вы можете передать оси из фиг, а затем из фиг2, чтобы получить то же самое график на каждом рисунке.

Быстрый пример того, как я думаю, это может работать для вашего кода (не проверено, но, надеюсь, вы поняли идею):

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

df = pd.DataFrame({'a': ['one', 'one', 'two', 'two', 'one', 'two', 'one', 'one', 'one', 'two'],
                   'b': [1, 2, 1, 2, 1, 2, 1, 2, 1, 1],
                   'c': [1, 2, 3, 4, 6, 1, 2, 3, 4, 6]})

# First fig
fig, ax = plt.subplots(ncols=3)
ax = ax.flatten()

# Some other fig
fig2, ax2 = plt.subplots(figsize=(4, 5))

def myboxplot(ax, df, myvar):
    ''' A function that takes the Axes instance as an input an plots a boxplot '''
    sns.boxplot(data=df, x='a', y=myvar, ax=ax)

def myscatterplot(ax, df):
    ''' A function that takes the Axes instance as an input an plots a scatterplot '''
    g=sns.scatterplot(data=df, x='b', y='c', ax=ax)

# Call the first function for the first 2 axes
myboxplot(ax[0], df, 'b') 
myboxplot(ax[1], df, 'c')

# Call the scatterplot function for an axes on the first fig
myscatterplot(ax[2], df)

# Call the scatterplot function for an axes on the second fig
myscatterplot(ax2, df)

plt.show() 
0 голосов
/ 05 августа 2020

sns.scatterplot () имеет параметр ax. Вы могли бы сделать следующее

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


df = pd.DataFrame({'a' :['one','one','two','two','one','two','one','one','one','two'], 'b': [1,2,1,2,1,2,1,2,1,1], 'c': [1,2,3,4,6,1,2,3,4,6]})

fig, ax = plt.subplots(ncols=3)
ax=ax.flatten()

for i in [0,1,2]:
    if(i<2):
        myvar=["b","c"][i]
        sns.boxplot( data=df,
            x='a', y=myvar, ax=ax[i])

sns.scatterplot(data=df, x='b', y='c', ax=ax[2])

plt.show() 
...