我有一个如下所示的数据框
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
然后尝试在x轴上用“ ind”分别绘制两组的“值”
df.plot()
但是我不想在图形中包括所有列,而是尝试基于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'])
再次失败
如何通过熊猫/袖扣执行它?
答案 0 :(得分:1)
您要求进行情节表达,但是使用plotly.graph_objs
几乎一样容易并且更灵活。
情节:
代码1:
import numpy as np
import plotly.graph_objs as go
# plotly setup and traces
fig = go.Figure()
# lines 1
fig.add_trace(go.Scatter(x=df.index, y=df['value'][1].values,
name = 'value_1',
mode = 'lines'))
# lines 2
fig.add_trace(go.Scatter(x=df.index, y=df['value'][2].values,
name = 'value_2',
mode = 'lines'))
# markers 1
fig.add_trace(go.Scatter(x=df.index, y=df['value'][1].values,
name = 'people',
mode = 'markers',
marker=dict(color=df['value_50'][1], colorscale='viridis', colorbar=dict(title='value_50')),
marker_size=df['people'][1]*1.8
)
)
# markers 2
fig.add_trace(go.Scatter(x=df.index, y=df['value'][2].values,
name = 'people',
mode = 'markers',
marker=dict(color=df['value_50'][2], colorscale='viridis', colorbar=dict(title='value_50')),
marker_size=df['people'][2]*1.8
)
)
# adjust and show final figure
fig.update_layout(legend=dict(x=-.15, y=1))
fig.show()
我仍然不确定100%您打算在这里做什么。让我知道这对您的工作原理,我们可以查看详细信息。
答案 1 :(得分:0)
我正在使用matplotlib
以所需的方式绘制数据图形。回顾一下您的问题,您希望在y轴上绘制value
,在x轴上绘制ind
的数据,每个特定的点大小将基于people
中的值柱。整个图分为两组。
数据透视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
图
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个不同的组,而不必手动分配任何值(颜色,点等)。