基于另一列的带有标记的熊猫线图

时间:2019-03-25 17:14:03

标签: python pandas matplotlib plotly pandas-groupby

我有一个如下所示的数据框

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()

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'])

再次失败

如何通过熊猫/袖扣执行它?

2 个答案:

答案 0 :(得分:1)

您要求进行情节表达,但是使用plotly.graph_objs几乎一样容易并且更灵活。

情节:

enter image description here

代码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()

enter image description here

首先,我希望创建图形并访问每个单独的标记以设置大小。不幸的是,我找不到这种解决方案。

相反,我们使用plt.scatter()为每个组绘制每个点。在这里,我们根据特定组的人员列来分配点的大小。然后,我们使用plt.plot()连接每个点,并分配标签和颜色。

编写的代码可以接受n个不同的组,而不必手动分配任何值(颜色,点等)。