Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib中打印具有相同属性的多个函数_Python_Matplotlib - Fatal编程技术网

Python 在matplotlib中打印具有相同属性的多个函数

Python 在matplotlib中打印具有相同属性的多个函数,python,matplotlib,Python,Matplotlib,我试图将来自单个参数的多个函数可视化。我需要做一些参数上的循环。我想为给定参数的所有绘制函数指定相同的颜色、图例等 问题是,我尝试的所有绘图,matplotlib都会指定不同的颜色,并且总是给出一个标签 基本上,我想实现以下目标: import numpy as np import matplotlib.pyplot as plt def plot2(): fig, ax = plt.subplots() x = np.arange(0,10,0.1) ax.pl

我试图将来自单个参数的多个函数可视化。我需要做一些参数上的循环。我想为给定参数的所有绘制函数指定相同的颜色、图例等

问题是,我尝试的所有绘图,matplotlib都会指定不同的颜色,并且总是给出一个标签

基本上,我想实现以下目标:

import numpy as np
import matplotlib.pyplot as plt
def plot2():    
    fig, ax = plt.subplots()
    x = np.arange(0,10,0.1)
    ax.plot(x,1*np.sin(x),'b-')
    ax.plot(x,1*np.cos(x),'b-',label='trig a={}'.format(1))
    ax.plot(x,2*np.sin(x),'g-')
    ax.plot(x,2*np.cos(x),'g-',label='trig a={}'.format(2))
    ax.plot(x,3*np.sin(x),'r-')
    ax.plot(x,3*np.cos(x),'r-',label='trig a={}'.format(3))
    ax.legend()
但功能如下:

def plotTrig():
    fig, ax = plt.subplots()
    x = np.arange(0,10,0.1)
    for a in [1,2,3]:
        ax.plot(x,a*np.sin(x),x,a*np.cos(x),label='trig a={}'.format(a))
    ax.legend()

以上只是一个简单的例子。实际上,我有更多的函数和参数,所以在颜色上循环的解决方案没有多大帮助

我想现在我明白你想要什么了。您永远不会用完颜色,因为
matplotlib
支持多种颜色定义。任何合法的HTML名称,任何RGB三元组

我不知道如何有条件地为艺术家设置标签,因此下面的部分(如果
if
)是一个可以由对
matplotlib
的内部工作有更多了解的人改进的技巧

import numpy as np
import matplotlib.pyplot as plt

def my_sin(x, a):
    return a * np.sin(x)

def my_cos(x, a):
    return a * np.cos(x)

def my_tanh(x, a):
    return np.tanh(x / a - 1)

def plotTrig(x, data, colors, parameters):
    fig, ax = plt.subplots()
    for ind, a in enumerate(parameters):
        for name, func in data.iteritems():
            if (name == 'sin'):  # or any other
                ax.plot(x, func(x, a), '-',
                        color=colors[ind],
                        label='trig a={}'.format(a))
            else:
                ax.plot(x, func(x, a), '-',
                        color=colors[ind])
    ax.legend()


if __name__ == '__main__':
    # prepare data
    x = np.arange(0,10,0.1)
    data = {}  # dictionary to hold the values
    data['sin'] = my_sin
    data['cos'] = my_cos
    data['tanh'] = my_tanh
    # list to hold the colors for each parameter
    colors = ['burlywood', 'r', '#0000FF', '0.25', (0.75, 0, 0.75)]
    # parameters
    parameters = [1, 2, 3, 4, 5]
    plotTrig(x, data, colors, parameters)
    plt.show()
其思想是将不同的函数放在一个容器中,这样我们就可以对它们进行迭代(一个列表也可以),然后对每个函数使用相同的颜色,但对每个参数使用不同的颜色。标签仅使用hacky
if
语句添加到一个函数中

如果我只是将字典值设置为函数的结果,我可以做得简单得多:

data['sin'] = np.sin(x)
然后用

ax.plot(x, a * func, '-',...
复制您的示例,但是您的参数只能应用于函数的结果。通过这种方式,您可以以任何方式将它们表示为函数

结果:

我不明白,如果每次都想要相同的颜色,为什么不能在plot语句中硬编码:
ax.plot(x,a*np.sin(x),x,a*np.cos(x),'-ks',label='trig a={}.format(a))
。请注意添加了
'-ks'
:这是一条黑色实线(-),在值所在的位置有正方形。您可以将其更改为所需的样式,并且每个绘图都将具有相同的样式。在最初的问题中,我为每个参数显示了超过10个函数,并且在迭代过程中显示了许多参数。硬编码颜色可以解决一些问题,但在某些情况下,我会用完颜色列表。另一个大问题是,每个函数都会有一个我必须避免的关联图例。此外,我正在根据参数对函数图进行分析,这将进一步完善。