如何更改绘图背景颜色?

374

我在matplotlib中制作散点图并需要将实际图的背景改为黑色。我知道如何使用以下代码更改绘图的面颜色:

fig = plt.figure()
fig.patch.set_facecolor('xkcd:mint green')

在此输入图像描述

我的问题是这改变了绘图周围空白的颜色。我该如何更改绘图的实际背景颜色?


13
补充一下 @Evert 的话,你可以直接使用 ax.patch.set_facecolor('black') (其中 ax 是图轴实例)。fig.patch 是图的背景,而 ax.patch 是轴的背景。 - Joe Kington
"薄荷绿"可能是你选择作为背景最糟糕的颜色之一。我喜欢它 :D - Aku
9个回答

370

使用您创建的图轴对象中的set_facecolor(color)方法,可以通过以下任一方式之一创建该对象:

  • 您同时创建了一个图和一个或多个轴

    fig, ax = plt.subplots(nrows=1, ncols=1)
    
  • 你创建了一个图形,然后稍后添加了坐标轴/轴线

  • fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • 如果你在使用状态API(如果你需要写的代码超过几行,尤其是如果你有多个图表,上面的面向对象方法会使生活更加轻松,因为你可以引用特定的图形、绘制在特定的坐标轴上,并进行任意的自定义)

  • plt.plot(...)
    ax = plt.gca()
    

然后您可以使用set_facecolor

ax.set_facecolor('xkcd:salmon')
ax.set_facecolor((1.0, 0.47, 0.42))

带有粉色背景的示例图

颜色可以是以下格式之一:

matplotlib.colors

Matplotlib可识别以下格式来指定颜色:

  • 由浮点值构成的RGB或RGBA元组,范围在[0, 1]内(例如,(0.1, 0.2, 0.5)(0.1, 0.2, 0.5, 0.3));
  • 一个十六进制RGB或RGBA字符串(例如'#0F0F0F''#0F0F0F0F');
  • 一个表示灰度级的[0, 1]之间的浮点值的字符串(例如'0.5');
  • {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}中的一个;
  • 一个X11 / CSS4颜色名称;
  • 来自xkcd颜色调查的名称,以'xkcd:'为前缀(例如'xkcd:天蓝色');
  • {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}中的一个,这是'T10'分类调色板的Tableau颜色(这是默认颜色循环);
  • “CN”颜色规范,即'C'后跟一个数字,该数字是默认属性周期(matplotlib.rcParams['axes.prop_cycle'])中的索引;索引发生在创建艺术家时,并且如果循环不包括颜色,则默认为黑色。

除“CN”之外的所有颜色字符串说明都不区分大小写。


如果有其他常见的生成坐标轴的方法,请告诉我。 - Nick T
看起来这个方法在过去的三年中消失了... MethodNotFound - Demis
@Demis 这个方法是最近几年才添加的。请参考 ImportanceOfBeingEarnest 的回答 了解如何在旧版本中执行此操作。 - Nick T

108

一种方法是在脚本内手动设置轴背景色的默认值(请参见自定义 matplotlib):

import matplotlib.pyplot as plt
plt.rcParams['axes.facecolor'] = 'black'

这与Nick T的方法形成对比,后者会更改特定axes对象的背景颜色。重置默认值非常有用,如果您正在制作多个具有相似样式的不同图表,并且不想不断更改不同的axes对象。

注意:相当于

fig = plt.figure()
fig.patch.set_facecolor('black')

你的问题是:

plt.rcParams['figure.facecolor'] = 'black'

这很有帮助!顺便说一下,我刚刚询问了如何将matplotlib.rcParams字典恢复到其原始默认值的正确方法。 - uhoh

44

像这样吗?使用axisbg关键字来subplot

>>> from matplotlib.figure import Figure
>>> from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
>>> figure = Figure()
>>> canvas = FigureCanvas(figure)
>>> axes = figure.add_subplot(1, 1, 1, axisbg='red')
>>> axes.plot([1,2,3])
[<matplotlib.lines.Line2D object at 0x2827e50>]
>>> canvas.print_figure('red-bg.png')

(虽然不是散点图,也不是黑色背景。)

enter image description here


3
在Windows系统中,我在绘图命令之前使用plt.subplot('111', axisbg='black')成功了。 - heltonbiker
14
axis_bgaxis_bgcolor 在 matplotlib 2.0.0 中已被弃用,并在 matplotlib 2.2.0 中移除。 - RubenLaguna

34

更简单的回答:

ax = plt.axes()
ax.set_facecolor('silver')

21

最简单的方法可能是在创建绘图时提供颜色:

fig1 = plt.figure(facecolor=(1, 1, 1))
或者
fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))

4
这只改变了窗口的背景颜色,而不是实际的图形颜色。 - Tom Cupis


18

其他答案中的一个建议是使用ax.set_axis_bgcolor("red")。然而,这种方法已经被弃用,在MatPlotLib >= v2.0上无效。

还有一种建议是使用ax.patch.set_facecolor("red")(在MatPlotLib v1.5和v2.2上都有效)。虽然这个方法也可以正常工作,但是在v2.0+中更简单的解决方案是使用

ax.set_facecolor("red")


FYI,ax.set_axis_bgcolor("black") 可以在 Python v2.7.14/MPL v1.5.1 上使用,但 ax.set_facecolor() 不行。在 MPL v1.5.1 和 v2.2.0 之间的某个版本中,正确的函数被更改了。 - Demis
1
@Demis 如果你需要一个适用于所有版本的解决方案,请使用 ax.patch.set_facecolor("red")。但是从 matplotlib 2.0 开始,推荐的方法是 ax.set_facecolor - ImportanceOfBeingErnest

2

2

我认为这可能对某些人有用:

如果您想更改围绕图形的背景颜色,可以使用以下方法:

fig.patch.set_facecolor('white')

所以,不是这样的:

Image with transparent background

而是这样的:

enter image description here

显然,您可以设置任何颜色。

P.S. 如果您意外地看不到两个图之间的区别,请尝试使用暗模式浏览StackOverflow。


1
你使用的是哪个cmap?或者你能提供伪代码,包括颜色等信息吗?它看起来非常漂亮。 - Amit Amola
1
嗨,我喜欢 seaborn 的颜色方案,所以我导入了它们的颜色等级,并在 matplotlib 中使用它们。 对于这个特定的图,我使用了以下三种颜色,以 RGB 格式定义: (255, 127, 0) (166, 207, 227) (176, 89, 40)。 您可以使用此链接查看 RGB 颜色如何混合:https://www.csfieldguide.org.nz/en/interactives/rgb-mixer/ - waykiki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接