Python - 当行索引和列都是类别时数据帧值的散点图
Posted
技术标签:
【中文标题】Python - 当行索引和列都是类别时数据帧值的散点图【英文标题】:Python - Scatter plot of dataframe values when row index and columns both are categories 【发布时间】:2021-06-14 10:04:33 【问题描述】:我有一个数据框,其中列和行都可以视为类别。我想在散点图上绘制每行中的值,y 轴上的行类别和不同颜色点的列类别,x 轴作为值的比例。 首选情节 - 情节或海上
模拟数据
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)),
columns=list('ABCD'), index=list('PQRST'))
df
# A B C D
# P 21 95 91 90
# Q 21 12 9 68
# R 24 68 10 82
# S 81 14 80 39
# T 53 17 19 77
# plot
df.plot(marker='o', linestyle='')
所需的图(类似于下图,但切换了 x 轴和 y 轴)
【问题讨论】:
【参考方案1】:在我看来,您构建 DataFrame 的方式(将索引设为分类 y 值并将每列设为颜色)会使您访问数据以进行绘图非常不方便。
相反,我认为你可以让你的生活更轻松,将一列用于值,一列用于类别P, Q, R, S, T
,最后一列用于类别A, B, C, D
,它们将对应于不同颜色的点。
对于数据可视化,我会推荐 Plotly express,因为我认为文档非常好,而且图表是交互式的也很好。例如,setting colors using column names 上有文档,这是我在下面的代码中完成的(这也是我建议以不同方式构建 DataFrame 的原因之一)。
import numpy as np
import pandas as pd
import plotly.express as px
np.random.seed(42)
df = pd.DataFrame(
'value':np.random.randint(0, 100, size=20),
'category':['P','Q','R','S','T']*4,
'color':['A','B','C','D']*5
)
df = df.sort_values(by='category')
fig = px.scatter(df, x='value', y='category', color='color')
## make the marker size larger than the default
fig.update_traces(marker=dict(size=14))
fig.show()
【讨论】:
【参考方案2】:使用 plotly 作为 pandas 的绘图后端,您需要做的就是使用 pd.melt()
从 wide to long 格式重塑您的数据框,然后运行:
df.plot(kind='scatter', x='value', y='index', color = 'variable')
完整代码:
import numpy as np
import pandas as pd
pd.options.plotting.backend = "plotly"
df = pd.DataFrame(np.random.randint(0, 100, size=(5, 4)),
columns=list('ABCD'), index=list('PQRST'))
df=pd.melt(df.reset_index(), id_vars=['index'], value_vars=df.columns)
df.plot(kind='scatter', x='value', y='index', color = 'variable')
【讨论】:
以上是关于Python - 当行索引和列都是类别时数据帧值的散点图的主要内容,如果未能解决你的问题,请参考以下文章