Как построить точечную диаграмму, используя фрейм данных pandas, где значения оси x равны n минус 1 столбцу, а последний столбец является зависимой переменной? - PullRequest
1 голос
/ 27 марта 2019

У меня есть датафрейм (df), скажем, он имеет 12 столбцов. Мне нужно построить диаграммы рассеяния 11 из этих столбцов (мои независимые переменные) относительно одного столбца (моя зависимая переменная). Другими словами, если мои имена столбцов - «x1», «x2», «x3», ... «x11» и «y12», я хочу создать массив рассеяния 3 на 4; все диаграммы рассеяния будут иметь одинаковые значения по оси Y 'y12', и каждая диаграмма рассеяния будет иметь различную зависимую переменную ('x1' для первой, 'x2' для второй диаграммы рассеяния и т. д.).

Я работаю с библиотеками pandas и matplotlib.pyplot, и мне нужна помощь в устранении неполадок следующего сценария:

    def plot_df_scatter_columns(x):
    row = [0,1,2]
    column = [0,1,2,3]
    for z in x:
        fig, axes = plt.subplots(3,4, figsize = (12, 8))

        for i,j in row, column:
            axes[i, j].scatter(df[x], df['y12'])
            axes[i, j].set_title(df.columns[x]+'vs. y12')
    return plt
    plot_df_scatter_columns(df)

Я ожидаю увидеть массив диаграмм рассеяния 3 на 4 с одной и той же зависимой переменной ('y12' на оси Y) и каждый график рассеяния, имеющий уникальную независимую переменную (значение оси X). Кроме того, каждый график рассеяния будет иметь уникальный заголовок, соответствующий столбцу, который использовался в качестве независимой переменной (ось X) из моего кадра данных.

Однако я получаю массив пустых графиков 3 на 4 без заголовков.

Ошибка, возникающая при работе в ноутбуке Jupyter:

ValueError: слишком много значений для распаковки (ожидается 2)

1 Ответ

0 голосов
/ 27 марта 2019

Во-первых, вы должны переместить объявление fig, axes вне цикла, чтобы не создавать новую фигуру для каждого столбца.

Кроме того, цикл по for i,j in row, column: не работает и создаст еще один цикл внутри вашего цикла по столбцам, который вам не нужен.

Таким образом, вместо того, чтобы указывать строки и столбцы, просто вычислите, какими должны быть i и j в цикле for z in df. Использование x в качестве кадра данных, а затем x в качестве индекса df не имеет смысла. В вашей функции вы даже не указали df, вы просто не получите сообщение об ошибке, потому что функция использует df из внешней области, что не очень хорошая практика.

Кроме того, возвращение plt на самом деле не способ сделать это, поскольку это означает модуль pyplot. Вы можете просто вызвать plt.show() в своей функции, так как вы, кажется, не назначаете свою функцию чему-либо, нет необходимости возвращать значение.

Итак, в целом работающий код:

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

# make sample dataframe
dicts = {}
keys = range(12)
for i in keys:
        dicts["x%s"%i] = list(np.random.randint(40, size=20))
dicts["y12"] = list(range(1,21))
df_sample = pd.DataFrame(dicts)

# function to plot your dataframe
def plot_df_scatter_columns(df):
    fig, axes = plt.subplots(3,4, figsize = (12, 8))

    # initialize i and j
    i=0
    j=0

    # loop over df.iloc[:, :-1] instead of df
    # to leave out last column in loop
    for z in df.iloc[:, :-1]:
        axes[i, j].scatter(df[z], df['y12'])
        axes[i, j].set_title(z + 'vs. y12')
        # calculate i and j on the fly during loop over df
        j += 1
        if j > 3:
            j=0
            i += 1

    plt.show()

plot_df_scatter_columns(df_sample)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...