【问题标题】:Python plot of points, each of different color?Python的点图,每个不同的颜色?
【发布时间】:2020-01-27 00:27:10
【问题描述】:

python 中的 Matplotlib 采用 xy 值的序列来生成数据图。

我们可以为正在绘制的特定图形指定颜色。但是,由于我们正在绘制一个明确的点列表,我想知道是否有一种方法可以单独指定每个点的颜色?

例如,如何使下图中绘制的每个点都具有特定的随机颜色?

import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('A single color plot')

【问题讨论】:

  • 我看不到分数
  • 您不是在绘制点,而是在绘制一条线。如果你想绘制点,你可以使用ax.scatter。相反,如果您希望对单个线段进行着色,则可以使用 LineCollection,如图所示,例如在this Q&A.
  • @ImportanceOfBeingErnest 哦,好吧,如果散点图可以为每个点采用单独的颜色,我也很满意。我该怎么做?
  • ax.scatter(x,y, c=np.random.rand(len(x), 3))
  • plot 创建一个Line2D 对象,该对象针对快速绘图进行了优化。让相同的命令plot 根据输入返回不同的对象是不好的风格。这就是为什么有LineCollection,如果不同的段应该有不同的属性,可以使用它。

标签: python matplotlib plot


【解决方案1】:

根据cmets中ImportanceOfBeingErnest的链接和建议,针对需要绘制不同颜色线段的情况,我拼凑了以下解决方案。

理想情况下,我希望每个点都具有特定的颜色,并且线段可以在这些各自颜色之间的色谱中平滑插值。但我想,matplotlib 是免费软件,所以它没有最花哨的功能也就不足为奇了。除非,当然,如果可以做到,但我不知道怎么做?

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
xy = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.hstack([xy[:-1], xy[1:]])
fig, ax = plt.subplots()
lc = LineCollection(segments, colors=np.random.rand(len(segments), 3))
ax.add_collection(lc)
ax.autoscale()
ax.set_title('A multi-color plot')
plt.show()

编辑:

只是为了好玩,做更多的步骤并“手动”创建渐变,正如ImportanceOfBeingErnest 建议的那样,我们可以得到例如像这样:

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
x = [0.]
while x[-1]<2 * np.pi :
    x.append(x[-1] +1/(100*np.sqrt(1+4*x[-1]*x[-1]*np.cos(x[-1]*x[-1])*np.cos(x[-1]*x[-1]))))
x = np.array(x)
y = np.sin(x ** 2)
xy = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.hstack([xy[:-1], xy[1:]])
myColors = np.random.rand(len(segments), 3)
for i in range(len(segments)//10):
    for j in range(9):
        myColors[10*i+j+1] = myColors[10*i]+(myColors[10*(i+1)]-myColors[10*i])*(j+1)/10
fig, ax = plt.subplots()
lc = LineCollection(segments, colors=myColors)
ax.add_collection(lc)
ax.autoscale()
ax.set_title('A multi-color plot')
plt.show()

【讨论】:

  • 当然可以。您可以将每个段再次分成几个较短的段,每个段在两个端点颜色之间插入一个颜色。
  • @ImportanceOfBeingErnest 哦,好的,我明白了。我有点希望会有某种自动混合器,这将使过程更简单......我的意思是,理想情况下需要一个连续的颜色渐变,这对于“手动”应用的离散方法几乎是不可行的。
猜你喜欢
  • 2019-05-25
  • 2017-07-26
  • 2017-05-09
  • 1970-01-01
  • 2022-01-24
  • 2015-03-29
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多