python/matplotlib - 多色线

ban*_*o40 1 python matplotlib

我正在尝试在某些条件下创建一条彩色线。基本上,我希望在 y 轴上指向下方时将线条着色为红色,指向上方时为绿色,而两者都不为蓝色。

我玩了一些我发现的类似例子,但我从来没有能够将它们转换为在轴上使用 plot() 。只是想知道如何做到这一点。

这是我到目前为止想出的一些代码:

#create x,y coordinates
x = numpy.random.choice(10,10)
y = numpy.random.choice(10,10)

#create an array of colors based on direction of line (0=r, 1=g, 2=b)
colors = []
#create an array that is one position away from original 
#to determine direction of line 
yCopy = list(y[1:])
for y1,y2 in zip(y,yCopy):
    if y1 > y2:
        colors.append(0)
    elif y1 < y2:
        colors.append(1)
    else:
        colors.append(2)
#add tenth spot to array as loop only does nine
colors.append(2)

#create a numpy array of colors
categories = numpy.array(colors)

#create a color map with the three colors
colormap = numpy.array([matplotlib.colors.colorConverter.to_rgb('r'),matplotlib.colors.colorConverter.to_rgb('g'),matplotlib.colors.colorConverter.to_rgb('b')])

#plot line
matplotlib.axes.plot(x,y,color=colormap[categories])
Run Code Online (Sandbox Code Playgroud)

不知道如何让 plot() 接受颜色数组。我总是收到有关用作颜色的格式类型的错误。尝试过十六进制、十进制、字符串和浮点数。与 scatter() 完美配合。

谢谢

Jul*_*nck 7

我不认为您可以在其中使用颜色数组plot(文档说颜色可以是任何 matlab 颜色,而scatter文档说您可以使用数组)。

但是,您可以通过分别绘制每一行来伪造它:

import numpy
from matplotlib import pyplot as plt

x = range(10)
y = numpy.random.choice(10,10)
for x1, x2, y1,y2 in zip(x, x[1:], y, y[1:]):
    if y1 > y2:
        plt.plot([x1, x2], [y1, y2], 'r')
    elif y1 < y2:
        plt.plot([x1, x2], [y1, y2], 'g')
    else:
        plt.plot([x1, x2], [y1, y2], 'b')

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


ban*_*o40 7

好的。所以我想出了如何使用 LineCollecion 在轴上绘制线条。

import numpy as np
import pylab as pl
from matplotlib import collections  as mc

segments = []
colors = np.zeros(shape=(10,4))
x = range(10)
y = np.random.choice(10,10)
i = 0

for x1, x2, y1,y2 in zip(x, x[1:], y, y[1:]):
    if y1 > y2:
        colors[i] = tuple([1,0,0,1])
    elif y1 < y2:
        colors[i] = tuple([0,1,0,1])
    else:
        colors[i] = tuple([0,0,1,1])
    segments.append([(x1, y1), (x2, y2)])
    i += 1     

lc = mc.LineCollection(segments, colors=colors, linewidths=2)
fig, ax = pl.subplots()
ax.add_collection(lc)
ax.autoscale()
ax.margins(0.1)
pl.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明