Линейный график панд с маркерами на основе другого столбца - PullRequest
1 голос
/ 25 марта 2019

У меня есть фрейм данных, подобный следующему

df:

ind group people value value_50
 1      1    5    100    1
 1      2    2    90     1
 2      1    10   80     1
 2      2    20   40     0
 3      1    7    10     0
 3      2    23   30     0

И я попытался повернуть их, чтобы увидеть отдельные группы метрик в столбцах

df = data.pivot_table(index = data.ind, columns = ['group'], values = ['people', 'value','value_50'])
df

А затем попытался построить значение'для обеих групп отдельно с "ind" на оси x

df.plot()

enter image description here

но я не хочу включать все столбцы в график, вместо этого яя пытаюсь раскрасить маркер на основе df ['value_50'] и размера пузырька или маркера размера на основе df ['people'] в качестве параметров c и s соответственно.

Это поможет идентифицировать определенные точки на графике

df['value'].plot(c =df['value_50'], s = df['value'])

, но при этом появляется ошибка

AttributeError: Unknown property s

А также возможно ли это с запонками, потому что у меня естьпопробовал

 df['value'].iplot(c =df['value_50'], s = df['value'])

опять не удалось сделать

как это сделать с пандами / запонками?

1 Ответ

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

Я использую matplotlib для отображения данных так, как вы хотите. Чтобы повторить ваш вопрос, вы искали данные с value по оси Y и ind по осям X, и размер каждой конкретной точки будет основан на значении в столбце people. Весь график делится между каждой группой.

Pivot DF

df_pv = df.pivot(index='ind', columns='group', values=['people', 'value', 'value_50'])

>> out

       people   value   value_50
group   1   2   1   2   1   2
ind                     
1       5   2   100 90  1   1
2       10  20  80  40  1   0
3       7   23  10  30  0   0

Graph

import matplotlib.pyplot as plt

fig, ax = plt.subplots(1,figsize=(10,5))

ind = df_pv.index.values
# generate random hex color & create as many colors as groups.
r = lambda: random.randint(0,255)
colors = ['#%02X%02X%02X' % (r(), r(), r()) for i in range(len(df_pv.people.columns.values))]
labels = df_pv.people.columns.values

for i in range(len(df_pv.people.values[0])):
    val = df_pv.value.values[:,i]
    peop = df_pv.people.values[:,i]
    for j in range(len(peop)):
        plt.scatter(x=[ind[j]], y=[val[j]],
                marker='o', linestyle='--',s=peop[j]*7, color=colors[i])

    plt.plot(ind, val, color=colors[i], label=f'Group: {labels[i]}')

plt.legend()
plt.xticks(df_pv.index.unique())
plt.ylabel('Value')
plt.xlabel('Ind')
plt.title('Graph')
plt.show()

enter image description here

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

Вместо этого мы строим каждую отдельную точку для каждой группы, используя plt.scatter(). Здесь мы назначаем размер точки на основе столбца людей для конкретной группы. Затем мы соединяем каждую точку с помощью plt.plot() и назначаем метку и цвет.

Код был написан для принятия n различных групп без необходимости присваивать какое-либо значение вручную (цвета, точки и т. Д.).

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