2015-11-30 178 views
1

我有一个(H,ranges) = numpy.histogram2d()计算的结果,我试图绘制它。Matplotlib:个性化imshow轴

鉴于H我可以很容易地把它放到plt.imshow(H)得到相应的图像。 (见http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.imshow

我的问题是所产生的图像的轴线是H的“细胞计数”和是完全无关的ranges.

我知道可以使用关键字extent的值(如尖在:Change values on matplotlib imshow() graph axis)。但这种解决方案并不为我工作:我的range值不是线性增长(实际上他们会呈指数级)

我的问题是:我怎么可以把0​​的价值plt.imshow()?或者至少,还是我可以手动设置plt.imshow生成对象的标签值?编号extent不是一个好的解决方案。

回答

1

您可以将刻度标签更改为更适合您数据的内容。

例如,在这里我们将每5像素设定为一个指数函数:

import numpy as np 
import matplotlib.pyplot as plt 

im = np.random.rand(21,21) 

fig,(ax1,ax2) = plt.subplots(1,2) 

ax1.imshow(im) 
ax2.imshow(im) 

# Where we want the ticks, in pixel locations 
ticks = np.linspace(0,20,5) 
# What those pixel locations correspond to in data coordinates. 
# Also set the float format here 
ticklabels = ["{:6.2f}".format(i) for i in np.exp(ticks/5)] 

ax2.set_xticks(ticks) 
ax2.set_xticklabels(ticklabels) 
ax2.set_yticks(ticks) 
ax2.set_yticklabels(ticklabels) 

plt.show() 

enter image description here

+0

超级!我在几分钟内实现了它,完成了这项工作! –

+0

这是非常危险的,因为您已将数据值中的刻度标签分离。 – tacaswell

1

imshow用于显示图像,所以它不支持x和y箱。 你既可以使用pcolor代替,

H,xedges,yedges = np.histogram2d() 
plt.pcolor(xedges,yedges,H) 

或使用plt.hist2d直接方式绘制直方图。

2

扩展位上@thomas回答

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.image as mi 

im = np.random.rand(20, 20) 

ticks = np.exp(np.linspace(0, 10, 20)) 

fig, ax = plt.subplots() 

ax.pcolor(ticks, ticks, im, cmap='viridis') 
ax.set_yscale('log') 
ax.set_xscale('log') 

ax.set_xlim([1, np.exp(10)]) 
ax.set_ylim([1, np.exp(10)]) 

example result

通过让mpl负责非线性映射您现在可以准确地重叠其他艺术家。这有一个性能打击(因为pcolorAxesImage更昂贵),但获得准确的蜱是值得的。