具有不同大小圆圈的单列热图
Single Column Heatmap with Circle of Different Sizes
我从此处提供的示例进行扩展。
但是,我不知道如何使用带有 PathCollector 的 NumPy 数组来创建一个热图,该热图生成一个包含 20 个变量 (Term) 的单列,圆圈表示大小 (Number_Protein) 和颜色 (P_value_abs).
这是我到目前为止所取得的进展,如有任何帮助,我们将不胜感激。
ylabels = Shared["Term"]
xlabels = ["Overlap"]
x, y = np.meshgrid(1, 20)
s = Shared["Number_Protein"]
c = Shared["P_value_abs"]
fig, ax = plt.subplots()
R = s/s.max()/2
circles = [plt.Circle((j,i), radius=r) for r, j, i in zip(R, x, y)]
col = PatchCollection(circles, array=c, cmap="coolwarm")
ax.add_collection(col)
ax.set(xticklabels=xlabels, yticklabels=ylabels)
fig.colorbar(col)
plt.show()
这个问题已经回答了,但我只是想展示最终产品以防有人好奇。
Final Product
题目的具体目标有点难猜。这是一个尝试:
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib.collections import PatchCollection
import numpy as np
Shared = pd.DataFrame({'Term': ['Term{i}' for i in range(1, 7)],
'Number_Protein': np.random.randint(150, 220, 6),
'P_value_abs': np.random.uniform(50, 95, 6)})
ylabels = Shared["Term"]
xlabels = ["Overlap"]
s = Shared["Number_Protein"]
c = Shared["P_value_abs"]
norm = plt.Normalize(c.min(), c.max())
fig, ax = plt.subplots()
R = s / s.max() / 2
circles = [plt.Circle((0, i), radius=r) for i, r in enumerate(R)]
col = PatchCollection(circles, array=c, cmap="coolwarm", norm=norm)
ax.add_collection(col)
ax.set_xticks([0])
ax.set_xticklabels(xlabels)
ax.set_yticks(range(len(R)))
ax.set_yticklabels(ylabels)
ax.set_xlim(-0.5, 0.5)
ax.set_ylim(-0.5, len(ylabels)-0.5 )
ax.set_aspect('equal')
fig.colorbar(col)
plt.show()
这将创建一个圆的半径与“Number_Protein”成比例且颜色与“P_value_abs”成比例的绘图。请注意,当颜色值不在零和一之间时,需要 norm
将原始值转换为该范围。
我从此处提供的示例进行扩展。
但是,我不知道如何使用带有 PathCollector 的 NumPy 数组来创建一个热图,该热图生成一个包含 20 个变量 (Term) 的单列,圆圈表示大小 (Number_Protein) 和颜色 (P_value_abs).
这是我到目前为止所取得的进展,如有任何帮助,我们将不胜感激。
ylabels = Shared["Term"]
xlabels = ["Overlap"]
x, y = np.meshgrid(1, 20)
s = Shared["Number_Protein"]
c = Shared["P_value_abs"]
fig, ax = plt.subplots()
R = s/s.max()/2
circles = [plt.Circle((j,i), radius=r) for r, j, i in zip(R, x, y)]
col = PatchCollection(circles, array=c, cmap="coolwarm")
ax.add_collection(col)
ax.set(xticklabels=xlabels, yticklabels=ylabels)
fig.colorbar(col)
plt.show()
这个问题已经回答了,但我只是想展示最终产品以防有人好奇。
Final Product
题目的具体目标有点难猜。这是一个尝试:
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib.collections import PatchCollection
import numpy as np
Shared = pd.DataFrame({'Term': ['Term{i}' for i in range(1, 7)],
'Number_Protein': np.random.randint(150, 220, 6),
'P_value_abs': np.random.uniform(50, 95, 6)})
ylabels = Shared["Term"]
xlabels = ["Overlap"]
s = Shared["Number_Protein"]
c = Shared["P_value_abs"]
norm = plt.Normalize(c.min(), c.max())
fig, ax = plt.subplots()
R = s / s.max() / 2
circles = [plt.Circle((0, i), radius=r) for i, r in enumerate(R)]
col = PatchCollection(circles, array=c, cmap="coolwarm", norm=norm)
ax.add_collection(col)
ax.set_xticks([0])
ax.set_xticklabels(xlabels)
ax.set_yticks(range(len(R)))
ax.set_yticklabels(ylabels)
ax.set_xlim(-0.5, 0.5)
ax.set_ylim(-0.5, len(ylabels)-0.5 )
ax.set_aspect('equal')
fig.colorbar(col)
plt.show()
这将创建一个圆的半径与“Number_Protein”成比例且颜色与“P_value_abs”成比例的绘图。请注意,当颜色值不在零和一之间时,需要 norm
将原始值转换为该范围。