Подзаголовки, повторяющие один и тот же график 6 раз и создающие 6 фигур вместо одной

#python #for-loop #matplotlib #plot #subplot

Вопрос:

Итак, у меня есть этот код:

 def scatter(df, column_name):
  values = {data: list(df[data]) for data in column_name}

  data = list(values.values())
  labels = list(values.keys())
  
  for i in range(len(data)):
    for j in range(len(data)):
      if i == j:
        continue
      elif (i == 1) amp; (j == 0):
        continue
      elif (i == 2) amp; ((j == 0)|(j == 1)):
        continue
      elif (i == 3) amp; ((j == 0)|(j == 1)|(j == 2)):
        continue
      else:
        for k in range(6):
          ax = plt.subplot(3, 2, k 1)
          plt.scatter(data[i], data[j])
          plt.xlabel(labels[i])
          plt.ylabel(labels[j])
          plt.title('{} vs {}'.format(labels[i], labels[j]))
        plt.show()
        plt.clf()

scatter(roller_coasters, ['speed', 'height', 'length', 'num_inversions'])
 

но он выдает 6 фигур вместо 1, и на каждой фигуре один и тот же график повторяется 6 раз.

Пожалуйста, помогите мне решить эту проблему.

Ответ №1:

Ну, каждый раз, когда вы вводите else часть своего цикла, вы создаете 6 подзаголовков для данной i,j комбинации. Например, для i=0; j=1 цикла для k создает шесть подзаголовков, но только для этого конкретного i и. j И когда, созданная, фигура снова закрывается ( plt.clf() ). Далее i=0; j=2 создается следующий набор из 6 подзаголовков.

Вы можете упростить ситуацию , разрешив j начать цикл сначала i 1 , поэтому никаких тестов не требуется. Кроме того, значение, для которого подзаголовок будет создан следующим, может быть переменной k , которая увеличивается при каждом добавлении подзаголовка.

Вот несколько примеров кода:

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

def scatter(df, column_names):
    fig = plt.figure(figsize=(10, 12)) # set a size for the surrounding plot
    n = len(column_names)
    total = n * (n - 1) // 2
    ncols = 2
    nrows = (total   (ncols - 1)) // ncols
    k = 1
    for i in range(n):
        col_i = column_names[i]
        for j in range(i   1, n):
            col_j = column_names[j]
            ax = plt.subplot(nrows, ncols, k)
            plt.scatter(df[col_i], df[col_j])
            plt.xlabel(col_i)
            plt.ylabel(col_j)
            plt.title(f'{col_i} vs {col_j}')
            k  = 1
    plt.tight_layout() # fit labels and ticks nicely together
    plt.show() # only called once, at the end of the function

columns = ['speed', 'height', 'length', 'num_inversions']
roller_coasters = pd.DataFrame(np.random.rand(20, len(columns)), columns=columns)
scatter(roller_coasters, ['speed', 'height', 'length', 'num_inversions'])
 

6 подзаголовков

Комментарии:

1. Это работает! Спасибо!