我尝试可视化来自单个参数的多个功能。我需要做一些循环参数。我想为给定参数的所有绘制函数分配相同的颜色,图例等。
问题在于我尝试的所有图表,matplotlib分配不同的颜色并始终给出标签。
Basicaly我想得到类似的东西:
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()
以上只是简化示例。在实践中,我有更多的功能和参数,因此循环颜色的解决方案不是很有帮助
答案 0 :(得分:2)
我想现在我理解你想要的东西。你永远不会用完颜色,因为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, '-',...
重现您的示例,但您的参数只能应用于函数的结果。这样您就可以以任何方式使用它们作为一种功能。