[英]How to do line plot for each column separately based on another column for each two samples for pandas dataframe?
[英]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.