kaitobook1357
@kaitobook1357

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonを用いて両対数グラフ上で近似曲線を作る方法を教えてください

解決したいこと

Pythonを用いて両対数グラフで近似曲線を作ろうとしているのですが、作り方が分からず困っております。出来ればNumpyとMatplotlibのみで作りたいと考えております。

発生している問題・エラー

文法的なエラーは無いようですが、思った通りの直線が引けなくて困っております。
#回帰直線の所をどういじれば良いかが分からないです。

image.png

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

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

x = np.array([3.00, 2.50, 2.00, 1.50, 1.00, 0.50])
y = np.array([185, 162, 139, 115, 86, 51])

log_x = [np.log10(i) for i in x]
log_y = [np.log10(i) for i in y]

plt.xscale("log")
plt.yscale("log")
plt.xlim([x.min(),x.max()])
plt.scatter(x, y, color = 'black', marker='s') 
 
# 回帰直線
linear = np.polyfit(log_x, y, 1)
y_linear  = [linear[0] * x_linear + linear[1] for x_linear in log_x]
plt.plot(x, y_linear)
print('傾き:', linear[0])
#傾き: 17.696025465382565
print('切片:', linear[1])
#切片: 17.290544163649848
 
plt.xlabel('H/mm')
plt.ylabel('Q/mm')
plt.grid() 
 
plt.show()

自分で試したこと

全く分からず何もできておりません。初めての質問なので至らない部分もあるかと思いますが、教えていただけますとありがたいです。

0

1Answer

両対数表示で直線にするにはpolyfitのの代入は(log_x, log_y) にする必要があると思います。
10**log_xで元の形にして両対数表示にしています。
x,y(もしくは(log_x, y)でフィットしたものは直線にならないので良いようです。

ちなみに log_x = np.log10(x) と内包表記の必要ないです。

#%% 
x = np.array([3.00, 2.50, 2.00, 1.50, 1.00, 0.50])
y = np.array([185, 162, 139, 115, 86, 51])
log_x = np.log10(x)
log_y = np.log10(y)

#%% log_x, log_yでpolyfit
linear = np.polyfit(log_x, log_y, 1)
log_y_pred  = linear[1] + linear[0] * log_x

plt.xscale("log")
plt.yscale("log")
plt.scatter(10**log_x, 10**log_y, color = 'black', marker='s') 
plt.plot(10**log_x, 10**log_y_pred)
plt.show()

output.png

1Like

Your answer might help someone💌