matplotlib 中的命名颜色
Posted
技术标签:
【中文标题】matplotlib 中的命名颜色【英文标题】:Named colors in matplotlib 【发布时间】:2014-04-19 22:26:57 【问题描述】:matplotlib 中有哪些命名颜色可用于绘图?我可以在 matplotlib 文档中找到一个列表,声称这些是唯一的名称:
b: blue
g: green
r: red
c: cyan
m: magenta
y: yellow
k: black
w: white
但是,我发现这些颜色也可以使用,至少在这种情况下:
scatter(X,Y, color='red')
scatter(X,Y, color='orange')
scatter(X,Y, color='darkgreen')
但这些不在上面的列表中。有谁知道可用的命名颜色的详尽列表?
【问题讨论】:
基本上,它是所有的 html 颜色名称,所以如果你想要几个漂亮的图表,你可以随时用谷歌搜索“HTML 颜色”。不过,@BoshWash 在下面的出色回答为您提供了确切的列表。 matplotlib.org也有这张好图 这张照片不错,我可能应该注意到了。公平地说,它是在我发布这个问题的一个月前首次发布的,我很确定在那之前我已经多次搜索文档来寻找这个问题的答案。 【参考方案1】:我经常忘记我想使用的颜色的名称,并不断回到这个问题 =)
以前的答案很好,但我发现从发布的图像中获得可用颜色的概述有点困难。我更喜欢将颜色与相似颜色分组,所以我稍微调整了上面评论中提到的matplotlib answer,以获得按列排序的颜色列表。顺序与我用肉眼排序的方式不同,但我认为它提供了一个很好的概述。
我更新了图像和代码以反映已添加“rebeccapurple”,并且自从我最初发布此答案以来,三种鼠尾草颜色已移至“xkcd:”前缀下。
我确实与 matplotlib 示例没有太大变化,但这里是完整的代码。
import matplotlib.pyplot as plt
from matplotlib import colors as mcolors
colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)
# Sort colors by hue, saturation, value and name.
by_hsv = sorted((tuple(mcolors.rgb_to_hsv(mcolors.to_rgba(color)[:3])), name)
for name, color in colors.items())
sorted_names = [name for hsv, name in by_hsv]
n = len(sorted_names)
ncols = 4
nrows = n // ncols
fig, ax = plt.subplots(figsize=(12, 10))
# Get height and width
X, Y = fig.get_dpi() * fig.get_size_inches()
h = Y / (nrows + 1)
w = X / ncols
for i, name in enumerate(sorted_names):
row = i % nrows
col = i // nrows
y = Y - (row * h) - h
xi_line = w * (col + 0.05)
xf_line = w * (col + 0.25)
xi_text = w * (col + 0.3)
ax.text(xi_text, y, name, fontsize=(h * 0.8),
horizontalalignment='left',
verticalalignment='center')
ax.hlines(y + h * 0.1, xi_line, xf_line,
color=colors[name], linewidth=(h * 0.8))
ax.set_xlim(0, X)
ax.set_ylim(0, Y)
ax.set_axis_off()
fig.subplots_adjust(left=0, right=1,
top=1, bottom=0,
hspace=0, wspace=0)
plt.show()
其他命名颜色
于 2017 年 10 月 25 日更新。我将之前的更新合并到了这个部分。
xkcd
如果您想在使用 matplotlib 绘图时使用其他命名颜色,可以使用 xkcd crowdsourced color names,通过 'xkcd:' 前缀:
plt.plot([1,2], lw=4, c='xkcd:baby poop green')
现在您可以访问大量已命名的颜色!
表格
默认 Tableau 颜色可通过“tab:”前缀在 matplotlib 中使用:
plt.plot([1,2], lw=4, c='tab:green')
有十种不同的颜色:
HTML
您还可以通过HTML hex code 绘制颜色:
plt.plot([1,2], lw=4, c='#8f9805')
这更类似于指定 RGB 元组而不是命名颜色(除了十六进制代码作为字符串传递的事实),我不会包含您可以选择的 1600 万种颜色的图像。 ..
有关更多详细信息,请参阅the matplotlib colors documentation 和指定可用颜色的源文件_color_data.py
。
【讨论】:
感谢剧情!出于好奇,“y”与“yellow”真的不同吗?第一个情节将它们作为不同的颜色。 @ComputerScientist 是的,根据this Github issue 和链接的邮件列表讨论,单个字母颜色根据它们的 Matlab 对应物分配 RBG 值,而全名对应于 HTML 颜色。 Matlab 单字母颜色目前也遵循 HTML 标准,因此我不确定这是否是最近的 Matlab 更改,或者是否出于可见性等原因调整/选择了 matplotlib 单字母颜色,讨论中也提到了这一点。跨度> @AdrianTorrie:您可以奖励自己选择的赏金作为额外的“谢谢”!赏金奖励超级突出这个答案,并给回答者额外的分数。 感谢您及时更新! @joelostblom,在 xkcd 颜色图中,您是如何让十六进制代码在颜色名称(黑色)旁边显示为灰色的?【参考方案2】:Matplotlib 使用来自其 colors.py 模块的字典。
要打印名称,请使用:
# python2:
import matplotlib
for name, hex in matplotlib.colors.cnames.iteritems():
print(name, hex)
# python3:
import matplotlib
for name, hex in matplotlib.colors.cnames.items():
print(name, hex)
这是完整的字典:
cnames =
'aliceblue': '#F0F8FF',
'antiquewhite': '#FAEBD7',
'aqua': '#00FFFF',
'aquamarine': '#7FFFD4',
'azure': '#F0FFFF',
'beige': '#F5F5DC',
'bisque': '#FFE4C4',
'black': '#000000',
'blanchedalmond': '#FFEBCD',
'blue': '#0000FF',
'blueviolet': '#8A2BE2',
'brown': '#A52A2A',
'burlywood': '#DEB887',
'cadetblue': '#5F9EA0',
'chartreuse': '#7FFF00',
'chocolate': '#D2691E',
'coral': '#FF7F50',
'cornflowerblue': '#6495ED',
'cornsilk': '#FFF8DC',
'crimson': '#DC143C',
'cyan': '#00FFFF',
'darkblue': '#00008B',
'darkcyan': '#008B8B',
'darkgoldenrod': '#B8860B',
'darkgray': '#A9A9A9',
'darkgreen': '#006400',
'darkkhaki': '#BDB76B',
'darkmagenta': '#8B008B',
'darkolivegreen': '#556B2F',
'darkorange': '#FF8C00',
'darkorchid': '#9932CC',
'darkred': '#8B0000',
'darksalmon': '#E9967A',
'darkseagreen': '#8FBC8F',
'darkslateblue': '#483D8B',
'darkslategray': '#2F4F4F',
'darkturquoise': '#00CED1',
'darkviolet': '#9400D3',
'deeppink': '#FF1493',
'deepskyblue': '#00BFFF',
'dimgray': '#696969',
'dodgerblue': '#1E90FF',
'firebrick': '#B22222',
'floralwhite': '#FFFAF0',
'forestgreen': '#228B22',
'fuchsia': '#FF00FF',
'gainsboro': '#DCDCDC',
'ghostwhite': '#F8F8FF',
'gold': '#FFD700',
'goldenrod': '#DAA520',
'gray': '#808080',
'green': '#008000',
'greenyellow': '#ADFF2F',
'honeydew': '#F0FFF0',
'hotpink': '#FF69B4',
'indianred': '#CD5C5C',
'indigo': '#4B0082',
'ivory': '#FFFFF0',
'khaki': '#F0E68C',
'lavender': '#E6E6FA',
'lavenderblush': '#FFF0F5',
'lawngreen': '#7CFC00',
'lemonchiffon': '#FFFACD',
'lightblue': '#ADD8E6',
'lightcoral': '#F08080',
'lightcyan': '#E0FFFF',
'lightgoldenrodyellow': '#FAFAD2',
'lightgreen': '#90EE90',
'lightgray': '#D3D3D3',
'lightpink': '#FFB6C1',
'lightsalmon': '#FFA07A',
'lightseagreen': '#20B2AA',
'lightskyblue': '#87CEFA',
'lightslategray': '#778899',
'lightsteelblue': '#B0C4DE',
'lightyellow': '#FFFFE0',
'lime': '#00FF00',
'limegreen': '#32CD32',
'linen': '#FAF0E6',
'magenta': '#FF00FF',
'maroon': '#800000',
'mediumaquamarine': '#66CDAA',
'mediumblue': '#0000CD',
'mediumorchid': '#BA55D3',
'mediumpurple': '#9370DB',
'mediumseagreen': '#3CB371',
'mediumslateblue': '#7B68EE',
'mediumspringgreen': '#00FA9A',
'mediumturquoise': '#48D1CC',
'mediumvioletred': '#C71585',
'midnightblue': '#191970',
'mintcream': '#F5FFFA',
'mistyrose': '#FFE4E1',
'moccasin': '#FFE4B5',
'navajowhite': '#FFDEAD',
'navy': '#000080',
'oldlace': '#FDF5E6',
'olive': '#808000',
'olivedrab': '#6B8E23',
'orange': '#FFA500',
'orangered': '#FF4500',
'orchid': '#DA70D6',
'palegoldenrod': '#EEE8AA',
'palegreen': '#98FB98',
'paleturquoise': '#AFEEEE',
'palevioletred': '#DB7093',
'papayawhip': '#FFEFD5',
'peachpuff': '#FFDAB9',
'peru': '#CD853F',
'pink': '#FFC0CB',
'plum': '#DDA0DD',
'powderblue': '#B0E0E6',
'purple': '#800080',
'red': '#FF0000',
'rosybrown': '#BC8F8F',
'royalblue': '#4169E1',
'saddlebrown': '#8B4513',
'salmon': '#FA8072',
'sandybrown': '#FAA460',
'seagreen': '#2E8B57',
'seashell': '#FFF5EE',
'sienna': '#A0522D',
'silver': '#C0C0C0',
'skyblue': '#87CEEB',
'slateblue': '#6A5ACD',
'slategray': '#708090',
'snow': '#FFFAFA',
'springgreen': '#00FF7F',
'steelblue': '#4682B4',
'tan': '#D2B48C',
'teal': '#008080',
'thistle': '#D8BFD8',
'tomato': '#FF6347',
'turquoise': '#40E0D0',
'violet': '#EE82EE',
'wheat': '#F5DEB3',
'white': '#FFFFFF',
'whitesmoke': '#F5F5F5',
'yellow': '#FFFF00',
'yellowgreen': '#9ACD32'
你可以像这样绘制它们:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.colors as colors
import math
fig = plt.figure()
ax = fig.add_subplot(111)
ratio = 1.0 / 3.0
count = math.ceil(math.sqrt(len(colors.cnames)))
x_count = count * ratio
y_count = count / ratio
x = 0
y = 0
w = 1 / x_count
h = 1 / y_count
for c in colors.cnames:
pos = (x / x_count, y / y_count)
ax.add_patch(patches.Rectangle(pos, w, h, color=c))
ax.annotate(c, xy=pos)
if y >= y_count-1:
x += 1
y = 0
else:
y += 1
plt.show()
【讨论】:
感谢您的回答,这正是我想要的。我认为结合@Joe Kington 的评论,几乎涵盖了所有基础。 如果您想快速查看在线命名颜色的视觉列表:matplotlib.org/examples/color/named_colors.html【参考方案3】:除了BoshWash的回答,下面是他的代码生成的图片:
【讨论】:
【参考方案4】:要获得要在绘图中使用的完整颜色列表:
import matplotlib.colors as colors
colors_list = list(colors._colors_full_map.values())
所以,你可以这样快速使用:
scatter(X,Y, color=colors_list[0])
scatter(X,Y, color=colors_list[1])
scatter(X,Y, color=colors_list[2])
...
scatter(X,Y, color=colors_list[-1])
【讨论】:
以上是关于matplotlib 中的命名颜色的主要内容,如果未能解决你的问题,请参考以下文章
matplotlib自定义设置plt.colorbar函数配置颜色条的刻度数实战:自定义设置颜色条刻度并为刻度值进行命名和标签化