首页 > 解决方案 > 如何网格绘制 2D 分类数据

问题描述

我有看起来像这样的数据:

Name X    Y
A    HIGH MID
B    LOW  LOW
C    MID  LOW
D    HIGH MID

如何在带有 3x3 网格的 2-D 图表中绘制此数据,添加随机变化以放置每个数据点,包括其名称,彼此之间有足够的间距。

所以它应该看起来像这样: 在此处输入图像描述

以下我尝试了,但我不知道如何在网格上而不是在网格上绘制值,所以它们不会重叠。

import pandas as pd
import matplotlib.pyplot as plt

### Mock Data ###
data = """A0,LOW,LOW
A,MID,MID
B,LOW,MID
C,MID,HIGH
D,LOW,MID
E,HIGH,HIGH"""

df = pd.DataFrame([x.split(',') for x in data.split('\n')])
df.columns = ['name','X','Y']

### Plotting ###
fig,axs = plt.subplots()
axs.scatter(df.X,df.Y,label=df.name)
axs.set_xlabel('X')
axs.set_ylabel('Y')
for i,p in enumerate(df.name):
    axs.annotate(p, (df.X[i],df.Y[i]))
axs.grid()
axs.set_axisbelow(True)
fig.tight_layout()
plt.show()

结果: 在此处输入图像描述

标签: pythonmatplotlibplotcategorical-data

解决方案


您可以直接控制位置并更改轴上的标签。您的绘图存在一些问题,因为您没有考虑一些问题,例如“如果您在同一位置有多个点,您将拥有什么标签?”。

无论如何,这是一个可能的解决方案:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

### Mock Data ###
data = """A0,LOW,LOW
A,MID,MID
B,LOW,MID
C,MID,HIGH
D,LOW,MID
E,HIGH,HIGH"""

df = pd.DataFrame([x.split(',') for x in data.split('\n')])
df.columns = ['name','X','Y']

pos = [0, 1, 2]
lbls = ["LOW", "MID", "HIGH"]
trans = {lbls[i]:pos[i] for i in range(len(pos))}

mat = np.zeros((3, 3), dtype="U10") # This is limited to 10 characters
xxs = []
yys = []
offset = 0.05

for i in range(df.shape[0]):
    xc, yc = trans[df.X[i]], trans[df.Y[i]]
    if mat[xc, yc]=="":
        mat[xc, yc] = df.name[i]
    else:
        mat[xc, yc] = mat[xc, yc] + ";" + df.name[i]
    xxs.append(xc)
    yys.append(yc)
fig,axs = plt.subplots()
axs.scatter(xxs, yys)
for i in range(df.shape[0]):
    name = mat[xxs[i], yys[i]]
    axs.text(xxs[i]+offset, yys[i]+offset, name)
axs.set_xticks(pos)
axs.set_xticklabels(lbls)
axs.set_yticks(pos)
axs.set_yticklabels(lbls)
for i in pos:
    axs.axhline(pos[i]-0.5, color="black")
    axs.axvline(pos[i]-0.5, color="black")
axs.set_xlim(-0.5, 2.5)
axs.set_ylim(-0.5, 2.5)
plt.show()

结果如下图:

自定义分类散点图


推荐阅读