2017-09-12 10 views
1

私は、Matplotlibを使って、energy()で定義された関数に続く行を持つプロットにいくつかの点をプロットしようとしています。ポイントはプラズマパラメータであり、ラインはデバイ長さの複数の値を使用してそれらを接続する関数に従います。MatplotlibとNumpy:高次数のログプロット

import matplotlib.pyplot as plt 
import numpy as np 

n_pts = [10**21,10**19,10**23,10**11,10**15,10**14,10**17,10**6] 
KT_pts = [10000,100,1000,0.05,2,0.1,0.2,0.01] 

n_set = np.logspace(6,25) 
debye_set = 7.43*np.logspace(-1,-7,10) 

def energy(n,debye): 
    return n*(debye/7430)**2 

fig,ax=plt.subplots() 

ax.scatter(n_pts,KT_pts) 

for debye in debye_set: 
    ax.loglog(n_set,energy(n_set,debye)) 

plt.show() 

これは、次のエラーを与える:

AttributeError: 'int' object has no attribute 'log' 
+3

あなたはPythonのエラーを報告するたびに、必ず*完全な*エラーメッセージ(すなわち完全なトレースバック)が含まれます。これには、エラーを引き起こした行などの有用な情報が含まれています。 –

+2

あなたのコードはうまく動作します。エラーはありません。 – saintsfan342000

+0

MacでPython 3.6を使ってもうまく動作します – bikemule

答えて

1

Pythonが** 10と同様に、(64ビットシステム)64ビット整数として保持することができるよりも大きな整数のための自動、奇妙なことを行い21。そうすることで、numpyはオブジェクトdtypeを使用する代わりに、そのようなオブジェクトにnumpy dtypeを自動的に使用しません。これは、順番に、np.logようufuncsをサポートしていません:

> np.log([10**3]) 
array([ 6.90775528]) 
> np.log([10**30]) 
AttributeError: 'int' object has no attribute 'log' 
ここに一つの簡単な解決策は次のように、それが実際に使用することができますDTYPEに、numpyのは大きな数字でn_pts、配列に変換していることを確認することです

フロート:

import matplotlib.pyplot as plt 
import numpy as np 

n_pts = np.array([10**21,10**19,10**23,10**11,10**15,10**14,10**17,10**6], dtype='float') 
KT_pts = [10000,100,1000,0.05,2,0.1,0.2,0.01] 

n_set = np.logspace(6,25) 
debye_set = 7.43*np.logspace(-1,-7,10) 

def energy(n,debye): 
    return n*(debye/7430)**2 

fig,ax=plt.subplots() 

ax.scatter(n_pts,KT_pts) 

for debye in debye_set: 
    ax.loglog(n_set,energy(n_set,debye)) 

plt.show() 

output

+0

ありがとうございました!これは非常に役に立ちます。数字が大きすぎるとは何か関係があったと思っていました。 –