基于逻辑改变matplotlib中的线条颜色

时间:2016-12-07 02:21:39

标签: python matplotlib

我似乎无法弄清楚如何根据一些简单的逻辑更改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

2 个答案:

答案 0 :(得分:2)

rassar's answer,使用条件来选择颜色(或绘图样式)是正确的。对于简单的情况,它完全没问题。

对于更复杂的情况,只是为自己设置,还有另一种选择:决策功能。您可以在d3jsBokeh和可视化应用中看到这些内容。

对于一个简单的案例,它类似于:

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}}的意思),错误可能在另一行。