如何在matplotlib子图中设置散点图colormap的clim范围?
解决Matplotlib散点图颜色映射范围设置无效的问题
当你用scatter()基于percent_mito给散点着色,尝试用axs[0].set_clim(0,0.1)设置颜色映射范围却无效时,核心原因是:scatter生成的颜色映射是绑定在PathCollection对象上的,而非坐标轴本身。你需要直接对这个散点对象操作,或者在调用scatter时直接指定范围。
两种有效解决方法:
方法1:调用scatter时直接指定vmin和vmax参数
这是最简洁的方式,直接在scatter函数中添加vmin和vmax参数,替代后续的set_clim操作:
fig, axs = plt.subplots(1,2, figsize=(10,4.5)) # 直接在scatter中指定颜色范围vmin=0, vmax=0.1 axs[0].scatter(my_data.obs['n_counts'], my_data.obs['n_genes'], c=my_data.obs['percent_mito'], cmap='viridis', s=2, vmin=0, vmax=0.1) axs[0].set_xlabel('n_counts') axs[0].set_ylabel('n_genes') axs[0].axhline(500, color='red') axs[0].axvline(1000, color='red') axs[0].axvline(35000, color='red') axs[1].scatter(my_data.obs['n_genes'], my_data.obs['percent_mito'], s=2) axs[1].set_xlabel('n_genes') axs[1].set_ylabel('percent_mito') axs[1].axhline(10, color='red') axs[1].axvline(500, color='red') plt.tight_layout()
方法2:保存scatter返回对象,再调用set_clim
如果需要后续动态调整颜色范围,可以先把scatter的返回值保存为变量,再对这个变量调用set_clim():
fig, axs = plt.subplots(1,2, figsize=(10,4.5)) # 保存scatter返回的PathCollection对象 scatter_obj = axs[0].scatter(my_data.obs['n_counts'], my_data.obs['n_genes'], c=my_data.obs['percent_mito'], cmap='viridis', s=2) # 对散点对象设置颜色范围 scatter_obj.set_clim(0, 0.1) axs[0].set_xlabel('n_counts') axs[0].set_ylabel('n_genes') axs[0].axhline(500, color='red') axs[0].axvline(1000, color='red') axs[0].axvline(35000, color='red') axs[1].scatter(my_data.obs['n_genes'], my_data.obs['percent_mito'], s=2) axs[1].set_xlabel('n_genes') axs[1].set_ylabel('percent_mito') axs[1].axhline(10, color='red') axs[1].axvline(500, color='red') plt.tight_layout()
补充说明
ax.set_clim()作用的是坐标轴默认的颜色映射范围,但当你用scatter的c参数指定颜色数据时,Matplotlib会为这个散点集合单独创建颜色映射,因此需要对散点对象本身设置范围,才能生效。
内容的提问来源于stack exchange,提问作者Carmen Sandoval
相关产品推荐
相关产品推荐

