Я использую 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()
Сначала я надеялся создать график и получить доступ к каждому отдельному маркеру, чтобы установить размер. К сожалению, я не смог найти решение, ведущее в этом направлении.
Вместо этого мы строим каждую отдельную точку для каждой группы, используя plt.scatter()
. Здесь мы назначаем размер точки на основе столбца людей для конкретной группы. Затем мы соединяем каждую точку с помощью plt.plot()
и назначаем метку и цвет.
Код был написан для принятия n различных групп без необходимости присваивать какое-либо значение вручную (цвета, точки и т. Д.).