我试图在 python 中的双对数刻度上针对 x 范围的三个区间绘制 3 个不同的函数。附上我想要创建的绘图类型的图像以及哪些函数 y,对于 x 的间隔。
我的代码尝试如下。也许我把它复杂化了。
import math as m
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt
x = np.arange(100) # this gives `array([0, 1, 2, ..., 9])`
y = np.arange(100)
for i in range (-50,20):
if x[i] < -43:
y[i] = m.log10((10**x[i])/(10**-43))**(1/2)
if x[i] > -43 and x[i] < -40:
y[i] = m.log10(np.exp((10**36)((10**x[i])-(10**-43))))
if x[i] >-40:
y[i] = m.log10((np.exp((10**36)((10**-40) - (10**-43)))(((10**x[i])/(10**-43))**(1/2)))
#i+=1
pl.plot(x,y)
#pl.xlim([-100.,100.])
#pl.ylim([-100.,100.])
pl.xlabel('log x')
pl.ylabel('log y')
pl.show()
请注意: 在 @Sembei 的帮助下更新了代码,该代码有效,但下面还有关于颜色的进一步问题:
import matplotlib.pyplot as plt
x = np.linspace(-50,23,500)
y = []
for xval in x:
if xval < -36:
y.append(m.log10(((10**xval)/(10**-36))**(1/2)))
elif -36 <= xval <= -34:
y.append(m.log10(np.exp((10**36)*((10**xval)-(10**-36)))))
else:
y.append(m.log10((np.exp((10**36)*((10**-34) - (10**-36)))*(((10**xval)/(10**-36))**(1/2)))))
plt.plot(x,y)
pl.xlim([-44.,-30.])
#pl.ylim([-10.,20.])
pl.xlabel('log x')
pl.ylabel('log y')
plt.show()
进一步问题: 如何为 3 个 x 间隔的不同 y 函数设置 3 种不同的颜色? 任何帮助表示赞赏。谢谢!
你可以这样做:
x = range(-50,23)
y = []
for xval in x:
if xval < -43:
y.append(-43) #your function in this interval
elif -43 <= xval <= -40:
y.append(xval) #your function in this interval)
else:
y.append(-40) #your function in this interval)
plt.plot(x,y, '.-')
plt.xlabel('log x')
plt.ylabel('log y')
plt.show()
您只需使用正确的语法填充
#your function in this interval
(请注意,在您的语法中缺少乘积运算符 *)
这里我使用 y 作为列表并附加值。您还可以将 y 初始化为全零并根据索引分配值。为此,您需要在循环中包含一个
enumerate
,它将为您提供 y 的索引,您必须在其中放置值。
注意:这里,
range
一步步进行。如果您想要更高的分辨率,您可能需要使用np.linspace,这样您就可以控制函数的分辨率。
编辑:我放置了该函数的一些玩具定义,以便您可以看到它是如何工作的。现在只需将我的函数定义更改为您自己的即可
如果您想在不同的时间间隔使用不同的颜色,这是一种可行的方法。具有独立 x 向量的三个图。
import matplotlib.pyplot as plt
import numpy as np
x1 = np.linspace(-50,-36,50)
x2 = np.linspace(-36, -34 ,10)
x3 = np.linspace(-34, 20, 100)
y1 = []
y2 = []
y3 = []
for xval in x1:
y1.append(np.log10(((10**xval)/(10**-36))**(1/2)))
for xval in x2:
y2.append(np.log10(np.exp((10**36)*((10**xval)-(10**-36)))))
for xval in x3:
y3.append(np.log10((np.exp((10**36)*((10**-34) - (10**-36)))*(((10**xval)/(10**-36))**(1/2)))))
plt.plot(x1,y1, color='r')
plt.plot(x2,y2, color='b')
plt.plot(x3,y3, color='g')
plt.xlabel('log x')
plt.ylabel('log y')
plt.show()