首页 > 解决方案 > 我定义了我的两个函数,但它没有绘制

问题描述

大家好,我正在尝试绘制这两个函数 x(x2) vs y(x2)。x(x2) 等于 log10(x_2) 并且 y(x_2) 等于 gam(x2),后者也等于 (gam0 - 0.0187 * temp * math.log10(1+628.14 55.556 x_2))。y(x_2) 的代码似乎工作正常,但我似乎无法让 x(x_2) 的代码工作。当它绘制它应该看起来像这样1

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

%matplotlib inline


gam0 = 72.8
temp = 293.15

#x = range(0, 10000)
#x_2= range(0, 10000)

def gam(x_2):
    returns = []
    for x_i in x_2:
        returns.append(gam0 - 0.0187 * temp * math.log10(1+628.14*55.556*x_i))
    return returns
def x(x_2):
    returns = math.log10(x_2)
    x()
 



plt.plot(gam(x_2), x(x_2))

plt.xlabel('Log_10x_2')
plt.ylabel('gamma (erg cm^2)')
plt.show()

这些是我得到的错误

NameError                                 Traceback (most recent call last)
<ipython-input-13-ac6002d962a0> in <module>
    25 
    26 
---> 27 plt.plot(gam(x_2), x(x_2))
    28 
    29 plt.xlabel('Log_10x_2')

<ipython-input-13-ac6002d962a0> in x(x_2)
    19     return returns
    20 def x(x_2):
---> 21     returns = numpy.log10(x_2)
    22 
    23     return returns

标签: pythonnumpymatplotlib

解决方案


我发现您的代码存在许多问题:

  1. 您的功能x(x_2)不返回任何内容。相反,它不断地递归调用自己。

  2. 您正在调用math.log10,它仅作用于单个数字,而不是数组。您可以将其包装在一个循环中,也可以调用该numpy版本。

  3. 在您的功能中,gam(x_2)您正在使用log10,但log需要。

  4. 您的绘图范围是,您需要在 x 轴上更小的值。我添加了两个变体,因为网格点的间距在线性和对数刻度上是不同的。此外,np.linspace()您可以指定网格点的数量,而不是步长。(有关详细信息,请参阅https://numpy.org/doc/1.18/reference/generated/numpy.linspace.html

这是整体代码

import matplotlib.pyplot as plt
import numpy as np

gam0 = 72.8
temp = 293.15

x_2 = np.linspace(1e-7, 1e-1, 1000)     # evenly spaced on linear scale
x_2 = 10**np.linspace(-7, -1, 1000)     # evenly spaced on logarithmic scale


def gam(x_2):
    return gam0 - 0.0187 * temp * np.log(1+628.14*55.556*x_2)

def x(x_2):
    return np.log10(x_2)
 
plt.plot(x(x_2), gam(x_2))
plt.xlabel('Log_10x_2')
plt.ylabel('gamma (erg cm^2)')

也可以让 matplotlib 处理 x 轴上的对数刻度:

plt.plot(x_2, gam(x_2))    
plt.xlabel('x_2')
plt.ylabel('gamma (erg cm^2)')    
plt.gca().set_xscale('log')

推荐阅读