如何为图形中绘制的每条线选择一种新颜色
- 2025-03-18 08:55:00
- admin 原创
- 49
问题描述:
我不想为每条绘制的线指定颜色,而是让每条线都有不同的颜色。但如果我运行:
from matplotlib import pyplot as plt
for i in range(20):
plt.plot([0, 1], [i, i])
plt.show()
然后我得到这个输出:
如果您查看上面的图片,您会发现 matplotlib 尝试为每行选择不同的颜色,但最终它会重复使用颜色 - 前十行使用的颜色与后十行相同。我只是想阻止它重复使用已经使用的颜色和/或为其提供要使用的颜色列表。
解决方案 1:
我通常使用其中第二个:
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 enumerate(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:
解决方案 2:
matplotlib 1.5+
您可以使用axes.set_prop_cycle
(示例)。
matplotlib 1.0-1.4
您可以使用axes.set_color_cycle
(示例)。
matplotlib 0.x
您可以使用Axes.set_default_color_cycle
。
解决方案 3:
您可以使用预定义的“定性色彩图”,如下所示:
import matplotlib as mpl
name = "Accent"
cmap = mpl.colormaps[name] # type: matplotlib.colors.ListedColormap
colors = cmap.colors # type: list
axes.set_prop_cycle(color=colors)
matplotlib.colormaps[]
在 matplotlib 3.5(从 2021 年起)及更高版本中受支持,而较旧的matplotlib.cm.get_cmap()
API 已弃用并将在 matplotlib 3.9(2024 年)中删除。有关为什么无法调用的讨论,请参阅https://github.com/matplotlib/matplotlib/issues/10840axes.set_prop_cycle(color=cmap)
。
预定义定性颜色图列表可在https://matplotlib.org/gallery/color/colormap_reference.html中找到:
解决方案 4:
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 中测试。
解决方案 5:
我不知道你是否可以自动改变颜色,但你可以利用循环来生成不同的颜色:
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])
解决方案 6:
正如Ciro 的回答所述,您可以使用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()
输出:
现在,所有的颜色都是不同的 - 尽管我承认我很难区分其中的一些颜色!
解决方案 7:
您还可以在文件中更改默认颜色循环matplotlibrc
。如果您不知道该文件在哪里,请在 Python 中执行以下操作:
import matplotlib
matplotlib.matplotlib_fname()
这将显示您当前使用的 matplotlibrc 文件的路径。在该文件中,您将发现许多其他设置,其中还包括 的设置axes.color.cycle
。只需输入您想要的颜色序列,您就会在绘制的每个图中找到它。请注意,您还可以在 matplotlib 中使用所有有效的 html 颜色名称。
解决方案 8:
matplotlib.cm.get_cmap
并且matplotlib.pyplot.cm.get_cmap
已被弃用,如matplotlib 3.7.0 中所述:弃用顶级 cmap 注册和访问函数mpl.cm
使用
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()
如为什么 Matplotlib 的颜色图结构不同?中所述,
.colors
将从 中提取颜色数组ListedColormap
,但不适用于LinearSegmentedColormap
,例如杂项颜色图中所示的颜色。解决方法是使用
colors = cmap(np.arange(0, cmap.N))
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()
扫码咨询,免费领取项目管理大礼包!