2017-02-27 17 views
1

Matplotlib 2.0.0のバージョンを使用して、与えられたデータで密度プロットを作成し、2軸x、yのログスケールを使用しようとしています。私は次のコードを作った、問題は、ログプロットのケースでは、正しい機能的な動作を与えていないことです。matplotlibのログログ密度 - 色プロット

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() 

私がプロットを作成するために使用しているデータは無関係ですが、単なる例です。したがって、最初のプロットは線形のスケールで与えられます。 2番目のプロットは対数尺度で与えられていますが、間違っていることは明らかです.2つのプロットは全く異なるので、同じデータを使用しています。また、私は両対数プロット

example without log scale

example with log scale

になぜこれが起こるすべてのアイデアをカラーバーを置く方法がわかりませんか?ご注意いただきありがとうございます。

PD:対数プロットを構築するために、私はエクステントキーワード及びそれを用いた(http://matplotlib.org/devdocs/users/whats_new.html#non-linear-scales-on-image-plots

答えて

1

に示す「画像プロット上の非リニアスケール」にapearsコードの一部を使用していますextent=(xmin, xmax, ymin, ymax)は、origin="lower"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

+0

良い仕事:ここ

は完全な例です!これはうまくいく。ありがとう – Joe

関連する問題