我似乎无法弄清楚如何根据一些简单的逻辑更改matplotlib中的linecolor。
例如,假设我有:
import numpy as np
from matplotlib import pyplot as plt
A = [1,2,3,4,5]
B = [2,4,6,8,10]
C = [1,3,5,6,7]
D = [1,2,3,3,3]
combined = [A,B,C,D]
现在,让我们说matplotlib将其绘制为折线图。因此,基于每个列表的组合应该有4个单独的行。
如果列表中的数字(合并的)大于5,则我想添加条件,然后单独的行为蓝色。否则,让个别行变为橙色。
我该如何做这样的事情?我知道以下情况会很好。
np_combined = np.array(combined)
times = np.linspace(0,1,5)
plt.plot(times,np_combined.T)
我需要一个双循环吗?我尝试了不止一些,但似乎最终每次都会出错。
for h in np_combined:
for k in range(5):
if k > 5:
plt.plot(times,k,color = 'blue')
else:
plt.plot(times,k,color = 'orange')
扫描字符串文字时错误是EOL
答案 0 :(得分:2)
rassar's answer,使用条件来选择颜色(或绘图样式)是正确的。对于简单的情况,它完全没问题。
对于更复杂的情况,只是为自己设置,还有另一种选择:决策功能。您可以在d3js,Bokeh和可视化应用中看到这些内容。
对于一个简单的案例,它类似于:
color_choice = lambda x: 'blue' if x > 5 else 'orange'
for sublist in np_combined:
plt.plot(times, sublist, color=color_choice(max(sublist)))
此处color_choice
也可以是传统的函数定义。使用lambda
功能只是因为它是一个简短的单行。
对于简单的情况,定义选择函数可能不比条件好多少。但是说你也想定义一种线条样式,而不是使用与颜色选择相同的条件。 E.g:
for sublist in np_combined:
largest = max(sublist)
if largest > 5:
if largest > 10:
plt.plot(times, sublist, color='blue', ls='--')
else:
plt.plot(times, sublist, color='blue', ls='-')
else:
if largest <= 2:
plt.plot(times, sublist, color='orange', ls='.')
else:
plt.plot(times, sublist, color='orange', ls='-')
现在你处在一个混乱的泡菜中,因为你有很多代码只需要相对简单的颜色和线条选择。这是重复的,违反了DRY软件工程原理,引发了错误。
决策功能可以大大清理它:
color_choice = lambda x: 'blue' if x > 5 else 'orange'
def line_choice(x):
if x > 10: return '--'
if x > 2: return '-'
return '.'
for sublist in np_combined:
largest = max(sublist)
plt.plot(times, sublist,
color=color_choice(largest)),
ls=line_choice(largest))
这不仅可以清理代码,本地化决策逻辑,还可以在程序发展过程中更轻松地更改颜色,样式和其他选择。这个软膏中唯一的缺点就是Python缺乏,AFIAK,D3&#39; excellent selection of mapping functions, aka "scales"。
答案 1 :(得分:1)
根据您的尝试,尝试:
EOL
此外,由于您的错误是您错过了结束引用(这是{{1}}的意思),错误可能在另一行。