Matplotlib如何设置x/y轴为相同0-10^5范围的等比例刻度?
异常原因
对数刻度坐标轴的有效取值范围是正实数,不支持将下限设为0——log(0)无数学定义(趋近负无穷),强行设置会直接导致刻度渲染错乱。另外你之前用的plt.xscale('log').xlim(0,10**5)链式调用写法本身也有问题:plt.xscale()没有返回值,无法直接接续调用xlim(),两类轴属性设置需要分开书写。
如果要实现0~10^5的对数刻度展示,只需将轴下限设为大于0的合理值即可:如果你的TPM数据最小值不小于1,下限设为1(对应log10刻度的0位点)就能匹配需求;如果数据存在小于1的TPM值,可把下限调整为你数据中的最小正数值(比如1e-1、1e-2)。
修正后可直接运行的代码
x = df2['bulk_TPM'] y = df2['scRNA_TPM'] plt.scatter(x,y,cmap='summer', edgecolor='black',linewidth=1, alpha=0.75) plt.xscale('log') plt.yscale('log') # 设置对数轴范围,下限必须大于0,这里以常用的下限1为例,可根据实际数据调整 plt.xlim(1, 10**5) plt.ylim(1, 10**5) plt.title('bulk vs scRNA log10 TPM') plt.xlabel('bulk_TPM') plt.ylabel('scRNA_TPM')
可选优化
如果需要让坐标轴刻度固定显示为10⁰、10¹……10⁵的标准对数格式,可以额外添加如下代码:
from matplotlib.ticker import LogLocator # 两个轴都设置以10为底的对数刻度,共6个刻度点(对应10^0到10^5) plt.gca().xaxis.set_major_locator(LogLocator(base=10, numticks=6)) plt.gca().yaxis.set_major_locator(LogLocator(base=10, numticks=6))
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

