#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'])
Комментарии:
1. Это работает! Спасибо!