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 - 当行索引和列都是类别时数据帧值的散点图的主要内容,如果未能解决你的问题,请参考以下文章

cf_936D

cf_936D

Excel,查看表中的值,其中行和列都是范围

算法review

转换后获取帧值的最佳方法?

合并具有多索引和列值的数据框