Линейный график графика из кадра данных Pandas (с несколькими линиями) - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время я работаю над приведенным ниже фреймом данных.

Фрейм данных

Для суммирования содержимого существует столбец "age", который относится к возрасту.group (то есть 16-25, 26-32) - и затем 8% -ых значений класса, это процентные значения, которые говорят мне, какой процент определенной возрастной группы относится к этому конкретному социальному классу.Таким образом, в этом примере 10,81% (округлено) людей в возрастной группе с идентификатором 1 также относятся к социальному классу с идентификатором 1. Для той же возрастной группы 22,34% в социальном классес идентификатором 2 и так далее, и тому подобное.Каждая строка составляет до 100%.

Я ищу создать линейный график, который имеет одну линию, представляющую каждую возрастную группу.Таким образом, этот график должен иметь в общей сложности 5 строк.

Ось X должна представлять социальные классы (в диапазоне от 1 до 8), а ось Y должна представлять процент людей в этом классе.

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

Любая помощь с этим будет оценена, я даже не знаю, с чего начать?Я пробовал несколько примеров в Интернете, но, похоже, ничего не работает.Даже стартер был бы великолепен.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Возможное решение для создания линейного графика по вашему запросу может быть (используя фиктивный набор данных):

import matplotlib.pyplot as plt
import pandas as pd

df=pd.DataFrame({"age":[1,2,3,4,5],"class1":[0.1,0.2,0.3,0.3,0.6],"class2":[0.4,0.1,0.2,0.3,0.6],"class3":[0.1,0.7,0.8,0.3,0.5]})
df=df.set_index("age")
for i in range(len(df)):
    plt.plot([k for k in df.columns],[df[y].iloc[i] for y in df.columns])
plt.legend(df.index,loc="upper left")
plt.show()

Вывод: enter image description here Вероятно, не самый питонический способ, хотя.

0 голосов
/ 01 июня 2018

Вы можете сделать это в две строки.Во-первых, вы можете просто транспонировать свой набор данных так, чтобы он находился в форме, которую вы хотите отобразить:

age          1       2       3       4       5
class1  0.5377  0.2147  0.4837  0.8682  0.3429
class2  0.8350  0.0544  0.4314  0.6592  0.6475
class3  0.9382  0.0283  0.7152  0.0962  0.3012
class4  0.7277  0.1523  0.3124  0.0077  0.4039
class5  0.7580  0.4149  0.1352  0.5068  0.2955
class6  0.3243  0.3346  0.2820  0.8481  0.9782
class7  0.2298  0.0522  0.7307  0.9851  0.8681
class8  0.3283  0.0562  0.9052  0.6320  0.6140

Затем создайте график, вызвав встроенную функцию графика:

df_plot.plot(figsize=(10,6), xticks=range(0, 8)).legend(title='age', bbox_to_anchor=(1, 1))

, что приводит к: enter image description here

0 голосов
/ 01 июня 2018

Вас может заинтересовать участок с накоплением.Это должно работать на вашем DataFrame с именем df:

df.drop(columns='age').plot(kind='area', stacked=True)

Одна из проблем заключается в том, что элементы легенды будут отображаться в обратном порядке по сравнению с вертикальным расположением областей графика.Чтобы это исправить, вы можете вручную изменить метки и метки легенды:

ax = plt.gca()
leg_handles, leg_labels = ax.get_legend_handles_labels()
ax.legend(leg_handles[::-1], leg_labels[::-1])

Вот некоторые примеры данных (текст сообщения, а не изображения, поэтому мы можем легко скопировать-вставить и поэкспериментировать :)):

df = pd.DataFrame({'age': [1, 2, 3], 
                   'Class1': [22, 14, 26], 
                   'Class2': [14, 15, 14], 
                   'Class3': [64, 71, 60]
                  })

Вывод: Stackplot demo

Чтобы изменить вертикальный порядок на графике так, чтобы класс 1 оказался вверху, отсортируйте столбцы (axis=1) вв порядке убывания перед построением графика:

df.drop(columns='age').sort_index(axis=1, ascending=False)plot(kind='area', stacked=True)
...