我有一个如下所示的 Pandas 数据框:
df = pd.DataFrame({'gender': [1,2,1,1,2,1],
'rating': [2,1,1,3,4,5],
'speed': [1,5,5,3,2,4],
'value':[4,4,3,2,2,1],
'appearance':[1,2,3,3,1,1],
'will_buy': [2,2,1,5,2,3]})
这是针对消费者研究的,其中列都是分类的,并且只采用一组有限的固定值。例如,在“性别”中,1 可能表示“男性”,而 2 可能表示“女性”。在“价值”中,1 可能表示“差”,而 5 可能表示“优秀”。
查看成对的数据图以注意任何趋势会很有用。
我尝试使用 Plotly Express 创建一对图,这是用于 Streamlit 仪表板的:
pairplot_fig = px.scatter_matrix(df, dimensions = df.columns)
st.plotly_chart(pairplot_fig)
如您所见,由于数据的分类性质,配对图并不能提供很多信息。例如,在某个位置可能有很多观察结果,但它只显示为一个点。此外,由于缺少间距,左边缘的列名变得杂乱无章。
然后我尝试创建一个 2D 热图,显示每个位置的观察数量。这将有助于揭示诸如“许多为价值选择 5 的人也倾向于为速度选择 5”之类的见解。
heatmap_fig = px.density_heatmap(df, x= 'gender', y='rating',
marginal_x="histogram", marginal_y="histogram")
st.plotly_chart(heatmap_fig, theme = None)
不幸的是,我只能弄清楚如何生成1列VS 1列的热图。生成一个多列对多列的热图是理想的,就像对图一样。
我希望在 Plotly Express 中这样做,因为它是交互式的。但如果那不可能,其他绘图包(如 Seaborn)中的解决方案也会有所帮助。
谢谢
您可能需要使用子图并根据需要进行配置:
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import pandas as pd
df = pd.DataFrame({'gender': [1, 2, 1, 1, 2, 1],
'rating': [2, 1, 1, 3, 4, 5],
'speed': [1, 5, 5, 3, 2, 4],
'value': [4, 4, 3, 2, 2, 1],
'appearance': [1, 2, 3, 3, 1, 1],
'will_buy': [2, 2, 1, 5, 2, 3]})
fig = make_subplots(1, 2, horizontal_spacing=0.15)
fig.add_trace(go.Heatmap(z=df[["gender", "rating"]]), 1, 1)
fig.add_trace(go.Heatmap(z=df[["gender", "rating"]]), 1, 2)
fig.show()