简体   繁体   English

python:如何用不同的颜色绘制一条线

[英]python: how to plot one line in different colors

I have two list as below:我有两个列表如下:

latt=[42.0,41.978567980875397,41.96622693388357,41.963791391892457,...,41.972407378075879]
lont=[-66.706920989908909,-66.703116557977069,-66.707351643324543,...-66.718218142021925]

now I want to plot this as a line, separate each 10 of those 'latt' and 'lont' records as a period and give it a unique color.现在我想将其绘制为一条线,将这些“latt”和“lont”记录中的每 10 个分开作为一个句点,并为其赋予独特的颜色。 what should I do?我该怎么办?

There are several different ways to do this.有几种不同的方法可以做到这一点。 The "best" approach will depend mostly on how many line segments you want to plot. “最佳”方法主要取决于您要绘制多少条线段。

If you're just going to be plotting a handful (eg 10) line segments, then just do something like:如果您只是要绘制少量(例如 10 个)线段,那么只需执行以下操作:

import numpy as np
import matplotlib.pyplot as plt

def uniqueish_color():
    """There're better ways to generate unique colors, but this isn't awful."""
    return plt.cm.gist_ncar(np.random.random())

xy = (np.random.random((10, 2)) - 0.5).cumsum(axis=0)

fig, ax = plt.subplots()
for start, stop in zip(xy[:-1], xy[1:]):
    x, y = zip(start, stop)
    ax.plot(x, y, color=uniqueish_color())
plt.show()

在此处输入图片说明

If you're plotting something with a million line segments, though, this will be terribly slow to draw.但是,如果您要绘制具有一百万条线段的内容,绘制起来会非常缓慢。 In that case, use a LineCollection .在这种情况下,请使用LineCollection Eg例如

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

xy = (np.random.random((1000, 2)) - 0.5).cumsum(axis=0)

# Reshape things so that we have a sequence of:
# [[(x0,y0),(x1,y1)],[(x0,y0),(x1,y1)],...]
xy = xy.reshape(-1, 1, 2)
segments = np.hstack([xy[:-1], xy[1:]])

fig, ax = plt.subplots()
coll = LineCollection(segments, cmap=plt.cm.gist_ncar)
coll.set_array(np.random.random(xy.shape[0]))

ax.add_collection(coll)
ax.autoscale_view()

plt.show()

在此处输入图片说明

For both of these cases, we're just drawing random colors from the "gist_ncar" coloramp.对于这两种情况,我们只是从“gist_ncar”颜色放大器中绘制随机颜色。 Have a look at the colormaps here (gist_ncar is about 2/3 of the way down): http://matplotlib.org/examples/color/colormaps_reference.html看看这里的颜色图(gist_ncar 大约下降了 2/3): http ://matplotlib.org/examples/color/colormaps_reference.html

Copied from this example :这个例子复制:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm

x = np.linspace(0, 3 * np.pi, 500)
y = np.sin(x)
z = np.cos(0.5 * (x[:-1] + x[1:]))  # first derivative

# Create a colormap for red, green and blue and a norm to color
# f' < -0.5 red, f' > 0.5 blue, and the rest green
cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N)

# Create a set of line segments so that we can color them individually
# This creates the points as a N x 1 x 2 array so that we can stack points
# together easily to get the segments. The segments array for line collection
# needs to be numlines x points per line x 2 (x and y)
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

# Create the line collection object, setting the colormapping parameters.
# Have to set the actual values used for colormapping separately.
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(z)
lc.set_linewidth(3)

fig1 = plt.figure()
plt.gca().add_collection(lc)
plt.xlim(x.min(), x.max())
plt.ylim(-1.1, 1.1)

plt.show()

See the answer here to generate the "periods" and then use the matplotlib scatter function as @tcaswell mentioned.请参阅此处的答案以生成“句点”,然后使用 @tcaswell 提到的matplotlib 分散函数。 Using the plot.hold function you can plot each period, colors will increment automatically.使用plot.hold函数可以绘制每个周期,颜色会自动增加。

Cribbing the color choice off of @JoeKington,抄袭@JoeKington 的颜色选择,

import numpy as np
import matplotlib.pyplot as plt

def uniqueish_color(n):
    """There're better ways to generate unique colors, but this isn't awful."""
    return plt.cm.gist_ncar(np.random.random(n))

plt.scatter(latt, lont, c=uniqueish_color(len(latt)))

You can do this with scatter .你可以用scatter做到这一点。

I have been searching for a short solution how to use pyplots line plot to show a time series coloured by a label feature without using scatter due to the amount of data points.我一直在寻找一个简短的解决方案,如何使用 pyplots 线图来显示由标签特征着色的时间序列,而不会由于数据点的数量而使用散点图

I came up with the following workaround:我想出了以下解决方法:

plt.plot(np.where(df["label"]==1, df["myvalue"], None), color="red", label="1")
plt.plot(np.where(df["label"]==0, df["myvalue"], None), color="blue", label="0")
plt.legend()

The drawback is you are creating two different line plots so the connection between the different classes is not shown.缺点是您正在创建两个不同的线图,因此未显示不同类之间的连接。 For my purposes it is not a big deal.就我而言,这没什么大不了的。 It may help someone.它可能会帮助某人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM