python 如何为地物中的每条绘制线选取新颜色

w8f9ii69  于 2023-06-20  发布在  Python
关注(0)|答案(8)|浏览(103)

我不想为每条绘制的线指定颜色,而是让每条线都有不同的颜色。但如果我跑了

from matplotlib import pyplot as plt
for i in range(20):
    plt.plot([0, 1], [i, i])

plt.show()

然后我得到这个输出:

如果你看上面的图片,你可以看到matplotlib试图为每一行选择不同的颜色,但最终它会重复使用颜色--前十行使用与后十行相同的颜色。我只是想阻止它重复已经使用的颜色和/或给它一个要使用的颜色列表。

ui7jx7zq

ui7jx7zq1#

我通常使用其中的第二个:

from matplotlib.pyplot import cm
import numpy as np

#variable n below should be number of curves to plot

#version 1:

color = cm.rainbow(np.linspace(0, 1, n))
for i, c in zip(range(n), color):
   plt.plot(x, y, c=c)

#or version 2:

color = iter(cm.rainbow(np.linspace(0, 1, n)))
for i in range(n):
   c = next(color)
   plt.plot(x, y, c=c)

示例2:

djp7away

djp7away2#

matplotlib 1.5+

您可以使用axes.set_prop_cycleexample)。

matplotlib 1.0-1.4

您可以使用axes.set_color_cycleexample)。

matplotlib 0.x

可以使用Axes.set_default_color_cycle

dohp0rv5

dohp0rv53#

您可以使用预定义的“定性色彩Map表”,如下所示:

from matplotlib.cm import get_cmap

name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

在matplotlib 3.0.3上测试。有关不能调用axes.set_prop_cycle(color=cmap)的原因,请参阅https://github.com/matplotlib/matplotlib/issues/10840
https://matplotlib.org/gallery/color/colormap_reference.html提供了预定义的定性色彩Map表列表:

1tu0hz3e

1tu0hz3e4#

prop_cycle

color_cycle在1.5中被弃用,以支持以下概括:http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt

plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

也显示在(现在命名错误)示例中:http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html提到:https://stackoverflow.com/a/4971431/895245
在matplotlib 1.5.1中测试。

vuktfyat

vuktfyat5#

我不知道你是否可以自动改变颜色,但你可以利用你的循环来生成不同的颜色:

for i in range(20):
   ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

在这种情况下,颜色将从黑色到100%绿色不等,但您可以根据需要调整。
参见matplotlib plot()文档并查找color关键字参数。
如果你想馈送一个颜色列表,只要确保你有一个足够大的列表,然后使用循环的索引来选择颜色

colors = ['r', 'b', ...., 'w']

for i in range(20):
   ax1.plot(x, y, color = colors[i])
yzckvree

yzckvree6#

正如Ciro's answer所指出的,您可以使用prop_cycle设置matplotlib要循环的颜色列表。有多少种颜色?如果你想用相同的颜色循环来绘制许多不同行数的图,该怎么办?
一种策略是使用类似于https://gamedev.stackexchange.com/a/46469/22397的公式来生成一个无限的颜色序列,其中每个颜色都试图与之前的所有颜色显着不同。
不幸的是,prop_cycle不接受无限序列--如果你传递一个,它将永远挂起。但是我们可以取,比如说,从这样一个序列中生成的前1000种颜色,并将其设置为颜色循环。这样,对于具有任何合理数量的线的图,您应该获得可区分的颜色。
示例:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler

# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
          for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))

for i in range(20):
    plt.plot([1, 0], [i, i])

plt.show()

输出:

现在,所有的颜色都不一样了--尽管我承认我很难分辨出其中的几种!

8ljdwjyq

8ljdwjyq7#

您还可以在matplotlibrc文件中更改默认颜色循环。如果你不知道这个文件在哪里,在python中执行以下操作:

import matplotlib
matplotlib.matplotlib_fname()

这将显示当前使用的matplotlibrc文件的路径。在该文件中,您将在许多其他设置中找到axes.color.cycle的设置。只要把你想要的颜色序列,你会发现它在每一个情节,你使。注意,你也可以在matplotlib中使用所有有效的html颜色名称。

t0ybt7op

t0ybt7op8#

  • matplotlib.cm.get_cmapmatplotlib.pyplot.cm.get_cmap已从matplotlib 3.7.0弃用
  • 使用matplotlib.colormaps[name]matplotlib.colormaps.get_cmap(obj)代替。
  • .get_cmap不再具有lut参数。使用.resampled
  • cmap = mpl.colormaps.get_cmap('viridis').resampled(20)创建matplotlib.colors.ListedColormap对象。
  • cmap = mpl.colormaps['viridis'].resampled(20)
  • colors = mpl.colormaps.get_cmap('viridis').resampled(20).colors创建一个颜色数数组。
import matplotlib as mpl
import matplotlib.pyplot as mpl
import numpy as np

colors = mpl.colormaps.get_cmap('viridis').resampled(20).colors

for i, color in enumerate(colors):
    plt.plot([0, 1], [i, i], color=color)

plt.show()

cmap = mpl.colormaps.get_cmap('summer').resampled(20)
colors = cmap(np.arange(0, cmap.N)) 

for i, color in enumerate(colors):
    plt.plot([0, 1], [i, i], color=color)

plt.show()

相关问题