python - 如何网格绘制 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()
解决方案
您可以直接控制位置并更改轴上的标签。您的绘图存在一些问题,因为您没有考虑一些问题,例如“如果您在同一位置有多个点,您将拥有什么标签?”。
无论如何,这是一个可能的解决方案:
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()
结果如下图:
推荐阅读
- html - 响应式图像 - 为什么此场景中的图像没有响应式?
- c# - 我可以在硒中获得元素值吗?
- html - 如何在输入标签之前显示标签
- android - 找不到 com.google.firebase:firebase-crashlytics 颤动
- sql - SQL 最大订单数
- laravel-5.6 - Laravel 5.6:不支持的操作数类型
- azure - 我们需要向 API M 门户添加同意书
- javascript - 自定义样式安装在 Angular 应用程序中的包的最佳方式
- installation - 如何使用 wix 安装程序添加公司名称
- java - 使用 MapStruct 时存在多个构造函数时出现“发现不明确的构造函数”错误