非数字 DataFrame 的散点图
Scatter plot for non-numeric DataFrame
我有一个只包含非数字数据的 DataFrame。
我有两个示例序列:
seq_1 = 'AATGMAM'
seq_2 = 'TATAMTM'
其中一个序列用作列,第二个用作索引。如果字母重叠,则 DataFrame 会填充一个“*”符号。否则,值为 ''.
data = [["*" if p1 == p2 else "" for p2 in seq_2] for p1 in seq_1]
df = pd.DataFrame(data, columns=list(seq_1), index=list(seq_2)
A A T G M A M
T *
A * * *
T *
A * * *
M
T *
M * *
现在我想创建一个散点图来描述这个 DataFrame。 x 轴应该是索引,y 轴应该是列。
我该怎么做?
编辑:感谢@Shaido,我能够绘制它。但是我在为每个标签添加单独的颜色时遇到问题。
color_keys = max([np.unique(df.index), np.unique(df.columns)], key=len)
rgb_values = sns.color_palette("Set2", len(color_keys))
colors = dict(zip(color_keys, rgb_values))
for g in np.unique(df.index):
ix = np.where(df.columns == g)
plt.scatter(x[ix], y[ix], c = colors[g], label = g, s = 100)
plt.xticks(np.arange(df.shape[0]), df.index)
plt.yticks(np.arange(df.shape[1]), df.columns)
plt.legend()
plt.show()
如何将每个唯一值映射到单独的列?
您可以使用np.where
获取散点图的坐标,然后我们调整y
值以反转轴,如下所示:
y, x = np.where(df == "*")
y = len(seq_2) - y
现在我们可以绘制它了,而不是 y 刻度也反转了:
fig, ax = plt.subplots()
ax.scatter(x, y)
ax.set_xticklabels(' ' + seq_1)
ax.set_yticklabels(' ' + seq_2[::-1])
plt.show()
结果:
我有一个只包含非数字数据的 DataFrame。 我有两个示例序列:
seq_1 = 'AATGMAM'
seq_2 = 'TATAMTM'
其中一个序列用作列,第二个用作索引。如果字母重叠,则 DataFrame 会填充一个“*”符号。否则,值为 ''.
data = [["*" if p1 == p2 else "" for p2 in seq_2] for p1 in seq_1]
df = pd.DataFrame(data, columns=list(seq_1), index=list(seq_2)
A A T G M A M
T *
A * * *
T *
A * * *
M
T *
M * *
现在我想创建一个散点图来描述这个 DataFrame。 x 轴应该是索引,y 轴应该是列。 我该怎么做?
编辑:感谢@Shaido,我能够绘制它。但是我在为每个标签添加单独的颜色时遇到问题。
color_keys = max([np.unique(df.index), np.unique(df.columns)], key=len)
rgb_values = sns.color_palette("Set2", len(color_keys))
colors = dict(zip(color_keys, rgb_values))
for g in np.unique(df.index):
ix = np.where(df.columns == g)
plt.scatter(x[ix], y[ix], c = colors[g], label = g, s = 100)
plt.xticks(np.arange(df.shape[0]), df.index)
plt.yticks(np.arange(df.shape[1]), df.columns)
plt.legend()
plt.show()
如何将每个唯一值映射到单独的列?
您可以使用np.where
获取散点图的坐标,然后我们调整y
值以反转轴,如下所示:
y, x = np.where(df == "*")
y = len(seq_2) - y
现在我们可以绘制它了,而不是 y 刻度也反转了:
fig, ax = plt.subplots()
ax.scatter(x, y)
ax.set_xticklabels(' ' + seq_1)
ax.set_yticklabels(' ' + seq_2[::-1])
plt.show()
结果: