我有一个对数分布的大型数据集。我想制作一个热图,所以我制作了一个2D直方图,并将其传递给implot。由于数据是对数分布,所以我将数据的对数传递给直方图。但是,在制作图时,我希望恢复轴(即10^hist bin值)和对数轴。如果我将轴设置为对数样式,那么图像看起来都是歪斜的。数据从我传递到直方图时就已经被“记录”了,所以我不希望图像受到影响,只是轴。所以,在下面的例子中,我想要左边的图像和右边的坐标轴。
我想我可以用一个假的叠加轴来做,但是如果有更好的方法的话,我不喜欢做这种事情...
import numpy as np
import matplotlib.pyplot as plt
x=10**np.random.random(10000)*5
y=10**np.random.random(10000)*5
samps, xedges, yedges = np.histogram2d(np.log10(y), np.log10(x), bins=50)
ax = plt.subplot(121)
plt.imshow(samps, extent=[0,5,0,5])
plt.xlabel('Log10 X')
plt.ylabel('Log10 Y')
ax = plt.subplot(122)
plt.imshow(samps, extent=[10**0,10**5,10**0,10**5])
plt.xlabel('X')
plt.ylabel('Y')
plt.xscale('log')
plt.yscale('log')
plt.show()
3条答案
按热度按时间a64a0gku1#
你需要使用一个自定义的格式化器,这里有一个来自matplotlib文档的例子:https://matplotlib.org/examples/pylab_examples/custom_ticker1.html
我倾向于使用
FuncFormatter
作为例子。主要的技巧是你的函数需要带参数x
和pos
。老实说,我不知道pos
是做什么的。也许甚至不是故意的,但是你可以使用FuncFormatter
作为装饰器,这就是我下面所做的:v1uwarro2#
如果你只想修改标签,你可以直接通过
plt.gca().set_xticklabels
和plt.gca().set_yticklabels
访问这些标签,下面是一个修改这些标签的_text
属性的简单例子。2eafrhcq3#
如果你需要在原始坐标系中的图像上绘图,你可以像下面这样叠加两个轴。当然你可以微调
ax[1]
以匹配原始的刻度数量等。基于this image的示例,参见结果here。