我可以在 matplotlib 中制作多色线条吗?

2025-02-12 10:03:00
admin
原创
81
摘要:问题描述:我正在尝试创建一条具有特定条件的彩色线。基本上,我希望当线指向 y 轴下方时,颜色为红色;当线指向上方时,颜色为绿色;当线指向下方或下方时,颜色为蓝色。我尝试了一些类似的示例,但始终无法将它们转换为在轴上使用 plot()。我只是想知道如何做到这一点。以下是我目前想到的一些代码:#create x,...

问题描述:

我正在尝试创建一条具有特定条件的彩色线。基本上,我希望当线指向 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])

不确定如何让 plot() 接受颜色数组。我总是收到有关用作颜色的格式类型的错误。尝试了十六进制、十进制、字符串和浮点数。与 scatter() 配合使用效果很好。


解决方案 1:

好的。所以我弄清楚了如何使用 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()

在此处输入图片描述

解决方案 2:

我认为您不能使用颜色数组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()

在此处输入图片描述

解决方案 3:

matplotlib 页面上有一个示例,展示了如何使用LineCollection绘制多色线。

剩下的问题是获取线条集合的颜色。因此,如果y要比较的值,

cm = dict(zip(range(-1,2,1),list("gbr")))
colors = list( map( cm.get , np.sign(np.diff(y))  ))

完整代码:

import numpy as np; np.random.seed(5)
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

x = np.arange(10)
y = np.random.choice(10,10)

points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

cm = dict(zip(range(-1,2,1),list("rbg")))
colors = list( map( cm.get , np.sign(np.diff(y))  ))

lc = LineCollection(segments, colors=colors, linewidths=2)
fig, ax = plt.subplots()
ax.add_collection(lc)

ax.autoscale()
ax.margins(0.1)
plt.show()

在此处输入图片描述

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2842  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1725  
  建设项目管理涉及众多环节与复杂流程,从规划设计到施工建设,再到竣工验收,每个阶段都需要高效的组织、协调与监控。随着数字化时代的到来,传统的项目管理方式面临诸多挑战,而数字化工具与平台的出现为建设项目管理带来了全新的思路与方法,极大地提升了管理效率与质量。在众多数字化工具与平台中做出合适的选择,成为建设项目管理者必须面对...
施工项目管理   1  
  建设项目管理是一个复杂且系统的工程,涉及众多环节与因素。成功的项目管理能够确保项目按时、按质量、在预算范围内交付,为相关方带来预期的收益。而在这一过程中,有五大关键成功因素起着决定性作用,它们相互关联、相互影响,共同构建起项目成功的基石。深入理解并有效运用这些因素,对于项目管理者而言至关重要。清晰的项目目标与规划明确清...
项目管理经验   1  
  在企业发展进程中,数字化转型已成为不可阻挡的趋势。它犹如一股强大的力量,推动着企业在复杂多变的市场环境中寻求新的突破与发展。而项目管理制度作为企业运营的重要支撑,在数字化转型的浪潮中扮演着举足轻重的角色。项目管理制度并非孤立存在,它与数字化转型紧密相连,相互影响、相互促进。有效的项目管理制度能够为数字化转型提供坚实的保...
工程项目管理的主要特征   1  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用