Matplotlib:个性化imshow轴

时间:2015-11-30 16:19:19

标签: python-3.x matplotlib

我有(H,ranges) = numpy.histogram2d()计算的结果,我试图绘制它。

鉴于H,我可以轻松地将其放入plt.imshow(H)以获取相应的图片。 (见http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.imshow

我的问题是所产生图像的轴是"细胞计数" H的{​​{1}}与ranges.

的值完全无关

我知道我可以使用关键字extent(如:Change values on matplotlib imshow() graph axis所示)。但是这个解决方案对我不起作用:我range上的值并没有线性增长(实际上它们呈指数级增长)

我的问题是:如何将range的值放在plt.imshow()中?或者至少,或者我可以手动设置plt.imshow结果对象的标签值吗?

编辑extent不是一个好方法。

3 个答案:

答案 0 :(得分: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处理非线性映射,您现在可以准确地过度绘制其他艺术家的情节。对此有一个性能影响(因为pcolor绘制的费用比AxesImage更贵),但获得准确的刻度是值得的。

答案 1 :(得分:1)

.factory('patients', ['$http', function($http){ var object = { patients: [] }; object.getAll = function() { return $http.get('/patients').success(function(data) { angular.copy(data, object.patients); }); } object.create = function(patient) { return $http.post('/patients', patient).success(function(data){ object.patients.push(data); }); } //add patient id to the url object.delete = function(patient) { return $http.delete('/patients/',patient).success(function(data){ console.log(data); }); } } }; return object; }]) 用于显示图像,因此它不支持x和y bin。 您可以改为使用imshow

pcolor

或使用直接绘制直方图的H,xedges,yedges = np.histogram2d() plt.pcolor(xedges,yedges,H)

答案 2 :(得分: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()

FIDDLE