MatplotlibDeprecationWarning: добавление осей, использующих те же аргументы, что и предыдущие оси, в настоящее время повторно использует более ранний экземпляр - PullRequest
0 голосов
/ 06 декабря 2018

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

Проблема заключается в том, что я вызываю функцию построения графиков несколько раз(см. код ниже), но я не знаю, как решить эту проблему.Я видел это решение , но на самом деле это не мое дело (или я не знаю, как его применить).

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

sns.set(style="whitegrid")
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=1, ncols=4, figsize=(16, 4))
plt.tight_layout()


def plot_data(df, nodes):
  global ax1, ax2, ax3, ax4
  if nodes == 10:
    plt.subplot(141)
    ax1 = sns.kdeplot(df['Metric'], cumulative=True, legend=False)
    ax1.set_ylabel('ECDF', fontsize = 16)
    ax1.set_title('10 Nodes')

  elif nodes == 20:
    plt.subplot(142)
    ax2 = sns.kdeplot(df['Metric'], cumulative=True, legend=False)
    plt.setp(ax2.get_yticklabels(), visible=False)
    ax2.set_title('20 Nodes')

  elif nodes == 30:
    plt.subplot(143)
    ax3 = sns.kdeplot(df['Metric'], cumulative=True, legend=False)
    plt.setp(ax3.get_yticklabels(), visible=False)
    ax3.set_title('30 Nodes')

  elif nodes == 40:
    plt.subplot(144)
    ax4 = sns.kdeplot(df['Metric'], cumulative=True, legend=False)
    plt.setp(ax4.get_yticklabels(), visible=False)
    ax4.set_title('40 Nodes')


df1 = pd.DataFrame({'Metric':np.random.randint(0, 15, 1000)})    
df2 = pd.DataFrame({'Metric':np.random.randint(0, 15, 1000)})    
df3 = pd.DataFrame({'Metric':np.random.randint(0, 15, 1000)})    

nodes = [10, 20, 30, 40]
for i in range(4):
  """
  In my real code, the DataFrames are calculated from reading CSV files.
  Since that code would be too long, I'm using dummy data. 
  """
  plot_data(df1, nodes[i])
  # I understand that this calls cause the warning, 
  # but I don't know how to solve it
  plot_data(df2, nodes[i])
  plot_data(df3, nodes[i])
plt.show()  

Ответы [ 2 ]

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

Вам необходимо удалить plt.subplot(nnn).Как говорится в предупреждении, выполнение этого в настоящее время будет повторно использовать экземпляр осей.Но в будущих версиях matplotlib это создаст новый экземпляр осей.

Решение состоит в том, чтобы передать оси, которые вы создали, в качестве аргумента вашей функции и использовать аргумент ax= seaborn.kdeplot:

sns.set(style="whitegrid")
fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(16, 4))
plt.tight_layout()

def plot_data(df, nodes, axes):
    ax1, ax2, ax3, ax4 = axes
    if nodes == 10:
        sns.kdeplot(df['Metric'], cumulative=True, legend=False, ax=ax1)
        ax1.set_ylabel('ECDF', fontsize = 16)
        ax1.set_title('10 Nodes')
    elif nodes == 20:
        sns.kdeplot(df['Metric'], cumulative=True, legend=False, ax=ax2)
        plt.setp(ax2.get_yticklabels(), visible=False)
        ax2.set_title('20 Nodes')
    elif nodes == 30:
        sns.kdeplot(df['Metric'], cumulative=True, legend=False, ax=ax3)
        plt.setp(ax3.get_yticklabels(), visible=False)
        ax3.set_title('30 Nodes')
    else:
        sns.kdeplot(df['Metric'], cumulative=True, legend=False, ax=ax4)
        plt.setp(ax4.get_yticklabels(), visible=False)
        ax4.set_title('40 Nodes')

for i in range(4):
    plot_data(df1, nodes[i], axes)
    plot_data(df2, nodes[i], axes)
    plot_data(df3, nodes[i], axes)
plt.show()

enter image description here

Обратите внимание, что вы можете упростить приведенное выше, используя sharey=True в fig, axes = plt.subplots(…, sharey=True) и удалив plt.setp(ax.get_yticklabels(), visible=False)

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

Это должно делать то, что вам нужно, я думаю - просто случай передачи осей в качестве аргументов и последующего помещения цикла в функцию

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

sns.set(style="whitegrid")
fig, axarr = plt.subplots(nrows=1, ncols=4, figsize=(16, 4))
plt.tight_layout()

nodes = [10, 20, 30, 40]

def plot_data(list_of_dfs, axarr, nodes):

    for df, ax, node in zip(list_of_dfs, axarr, nodes):
        ax = sns.kdeplot(df['Metric'], cumulative=True, legend=False)#I'm not completely sure this needs to be assignment, haven't used seaborn much
        ax.set_ylabel('ECDF', fontsize = 16)
        ax.set_title('{} Nodes'.format(nodes))

list_of_dfs = [df1, df2, df3]
plot_data(list_of_dfs, axarr, nodes)
plt.show()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...