Почему заголовок и x-метка для диаграмм одинаковы, даже если я уже включил их в цикл for? - PullRequest
0 голосов
/ 11 октября 2019

Я хочу, чтобы гистограмма имела собственный заголовок и метку оси x, поэтому я включил plt.title и plt.xlabel в цикл for. Однако заголовок и метка оси X одинаковы для обоих графиков после запуска кода. Название для первого графика должно быть Histogram of gender, а название для второго графика должно быть Histogram of job. Что не так с моим кодом или какую часть я сделал неправильно, особенно цикл? Любая помощь будет оценена! Заранее спасибо:)

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

# first data is age
# 2nd data is gender
# third data is saving
# 4th data is job

data = np.array([[11, "male",1222,"teacher"],[23,"female",333,"student"],
                 [15,"male",542,"security"],[23,"male",4422,"farmer"],[25,"female",553,"farmer"],
                 [22, "male", 221, "teacher"],[27, "male", 333, "agent"],[11, "female", 33, "farmer"]])

data_feature_names = ["age","gender","saving","job"]

# type of the data above
types = ["num","cat","num","cat"]
idx2 = []


for index, _type in enumerate(types):
    if _type == 'cat':
        idx2.append(index)


# Order of x axis label
ss = [["female","male"],["farmer","agent","security","teacher","student"]]


for k in range(0,len(ss)):
    for j in idx2:
        pandasdf = pd.DataFrame(data)
        sns.countplot(x=j, data=pandasdf, order = ss[k])
        plt.title("Histogram of " + data_feature_names[j])
        plt.xlabel(data_feature_names[j])
    plt.show()

1 Ответ

1 голос
/ 11 октября 2019

Ваш порядок в ss и имена столбцов в idx2 спарены, поэтому вы можете использовать один цикл и в конечном итоге получить желаемые результаты для гистограммы пола и задания (но в этом случае вы не получите в итогес гистограммами для возраста или сохранения). Последние несколько строк вашего примера будут выглядеть так:

for k, j in zip(range(0, len(ss)), idx2):
    pandasdf = pd.DataFrame(data)
    sns.countplot(x=j, data=pandasdf, order=ss[k])
    plt.title("Histogram of " + data_feature_names[j])
    plt.xlabel(data_feature_names[j])
    plt.show()

Есть несколько способов упростить это, чтобы немного легче было отлаживать. Например, вы можете сократить цикл для idx2, используя понимание списка:

idx2 = [ix for ix, f in enumerate(types) if f == "cat"]

Ниже я привел дополнительный пример с несколькими строками кода, но с большей модификацией по сравнению с оригинальным сценарием. .

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

data = pd.DataFrame(
    [
        [11, "male", 1222, "teacher"],
        [23, "female", 333, "student"],
        [15, "male", 542, "security"],
        [23, "male", 4422, "farmer"],
        [25, "female", 553, "farmer"],
        [22, "male", 221, "teacher"],
        [27, "male", 333, "agent"],
        [11, "female", 33, "farmer"],
    ],
    columns=["age", "gender", "saving", "job"],
)

ordering = {
    "gender": ["female", "male"],
    "job": ["farmer", "agent", "security", "teacher", "student"],
}

for column in ['gender', 'job']:
    ax = sns.countplot(x=column, data=data, order=ordering.get(column, None))
    ax.set_title("Histogram of {}".format(column))
    ax.set_xlabel(column)
    plt.show()
...