簡體   English   中英

帶有基於另一列的標記的熊貓線圖

[英]Pandas line plot with markers based on another column

我有一個如下所示的數據框

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

再次失敗

如何使用熊貓/袖扣進行表演?

您要求 plotly express,但使用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% 確定您在這里打算做什么。 讓我知道這對你有什么作用,我們可以看看細節。

我正在使用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 個不同的組,而無需手動分配任何值(顏色、點等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM