matplotlib中的对数 - 对数密度 - 颜色图

时间:2017-02-27 15:24:14

标签: python matplotlib

我正在尝试使用Matplotlib 2.0.0的版本创建具有给定数据的密度图并使用两个轴x,y中的对数刻度。我已经做了以下代码,问题是对于日志情节的情况下没有给出正确的功能行为。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

init = 0.0
points = 500
final_value = 100
steep = (final_value-init)/points
list_values_x = np.arange(init,final_value,steep)
list_values_y = np.arange(init,final_value,steep)

#WE CREATE OUT DATA FILE

f1 = open("data.txt", "w")
for i in list_values_x:
    for j in list_values_y:
        f1.write( str(i) +" "+str(j)+" "+str(0.0001*(i**2+j**2)) +"\n")

f1.close()


#NOW WE OPEN THE FILE WITH THE DATA AND MAKE THE PLOT
x,y,temp = np.loadtxt('data.txt').T #Transposed for easier unpacking

nrows, ncols = points, points
grid = temp.reshape((nrows, ncols))

# LINEAR PLOT

fig1 = plt.imshow(grid, extent=(x.min(), x.max(), y.max(), y.min()),
           interpolation='nearest', cmap=cm.gist_rainbow)
plt.axis([x.min(), x.max(),y.min(),  y.max()])
plt.colorbar()
plt.suptitle('Example', fontsize=15)
plt.xlabel('x', fontsize=16)
plt.ylabel('y', fontsize=16)

plt.show()

# LOG-LOG PLOT

fig, (ax1) = plt.subplots(ncols=1, figsize=(8, 4))

ax1.imshow(grid, aspect="auto", extent=(1, 1e2, 1, 1e2), interpolation='nearest')
ax1.set_yscale('log')
ax1.set_xscale('log')
ax1.set_title('Example with log scale')



plt.show()

我用来制作情节的数据是无关紧要的,这只是一个例子。因此,第一个图以线性比例给出。第二个图用log-log标度给出,但很明显它是不正确的,两个图的行为完全不同,我使用相同的数据。此外,我不知道如何在对数日志中添加一个颜色条

example without log scale

example with log scale

知道为什么会这样吗?谢谢你的关注。

PD:为了构建对数 - 对数图,我使用了(http://matplotlib.org/devdocs/users/whats_new.html#non-linear-scales-on-image-plots)中给出的“图像图上的非线性比例”中的部分代码

1 个答案:

答案 0 :(得分:1)

extent=(xmin, xmax, ymin, ymax)中另外使用origin="lower"时,使用extent关键字及imshow更有意义。您可能还需要设置轴的限制,因为自动功能对于日志比例无效。

以下是完整的示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from mpl_toolkits.axes_grid1 import make_axes_locatable

points = 500
init = 0.0
final_value = 100
steep = (final_value-init)/points
x = np.arange(init,final_value,steep)
y = np.arange(init,final_value,steep)
X,Y = np.meshgrid(x,y)
Z = 0.0001*(X**2+Y**2)

fig, (ax, ax1) = plt.subplots(ncols=2, figsize=(8, 4))
# LINEAR PLOT
im = ax.imshow(Z, extent=(x.min(), x.max(), y.min(), y.max() ),
           interpolation='nearest', cmap=cm.gist_rainbow, origin="lower")
ax.set_title('lin scale')

#make colorbar
divider = make_axes_locatable(ax)
ax_cb = divider.new_horizontal(size="5%", pad=0.05)
fig.add_axes(ax_cb)
fig.colorbar(im, cax = ax_cb, ax=ax)

# LOG-LOG PLOT
im1 = ax1.imshow(Z,  extent=(1, 1e2, 1, 1e2), 
           interpolation='nearest',cmap=cm.gist_rainbow, origin="lower")
ax1.set_yscale('log')
ax1.set_xscale('log')
ax1.set_xlim([1, x.max()])
ax1.set_ylim([1, y.max()])
ax1.set_title('log scale')

#make colorbar
divider1 = make_axes_locatable(ax1)
ax_cb1 = divider1.new_horizontal(size="5%", pad=0.05)
fig.add_axes(ax_cb1)
fig.colorbar(im1, cax = ax_cb1, ax=ax1)

plt.tight_layout()
plt.show()

enter image description here