Построение нескольких гистограмм на одном графике на основе количества столбцов в фрейме данных Python - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть наборы фреймов данных, которые я группирую в функции, которая строится на основе like имен с использованием .filter(like='some string').

Мои фреймы данных имеют тенденцию выглядеть следующим образом:

d = {'Upper Density': [1, 2, 4, 6], 'Lower Density': [3, 4, 7, 8], 'Mid Density': [6, 5, 7, 10], 'High Temperature' : [10, 11, 12, 10], 'Low Temperature' : [4, 5, 6, 7]}

df = pd.DataFrame(data=d)

variables = list(df.columns)

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

У меня есть list имен переменных строк, которые я использую для фильтрации по имени variables, который просто содержит имена столбцов в d.

Мой код выглядит следующим образом:

для var_name в переменных:

df_var = (df.filter(like=str(var_name))).astype(float) # filter on each variable for comparison
n = len(df_var.columns) # get the length of each set of columns

fig, ax = plt.subplots(1, n, sharex='col', sharey='row', figsize=(16,8)) # set the default axis parameters
axes = ax.ravel()

for i, j in zip(range(n), axes):

    # Plot Frequency
    j.hist([df_var.iloc[:,i-1], df_var.iloc[:,i]], alpha=0.4, bins=bin_size, color=colors)
    j.set_title(df_var.columns[i][:])
    j.legend(loc='best')
    j.grid(True)

Когда они повторяются, они выстраивают 2 одинаковых гистограммы бок о бок, потому что subplots имеет аргументы 1 и n.Но для того, чтобы я повторил, я не понимаю, как мне обойтись, используя subplots.

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

Как я могу изменить свой код, чтобы получить это?

1 Ответ

0 голосов
/ 18 февраля 2019

Это было решено заменой всего цикла простым вызовом np.array().

fig, ax = plt.subplots(1, n, sharex='col', sharey='row', figsize=(16,8)) # set the default axis parameters
axes = ax.ravel()

for i, j in zip(range(n), axes):
# Plot Frequency
j.hist([df_var.iloc[:,i-1], df_var.iloc[:,i]], alpha=0.4, bins=bin_size, color=colors)
j.set_title(df_var.columns[i][:])
j.legend(loc='best')
j.grid(True)

Был изменен на:

fig, ax = plt.subplots(sharex='col', sharey='row', figsize=(14,8)) # set the default axis parameters

plt.hist(np.array(df_var), bins=bins, alpha=0.7)
plt.title(df_var.columns[i][:]+' with '+df_var.columns[i+1][:])
...