Como mudar a cor de fundo da plotagem?

226

Estou criando um gráfico de dispersão no matplotlib e preciso alterar o plano de fundo do gráfico real para preto. Eu sei como alterar a cor da face do gráfico usando:

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

insira a descrição da imagem aqui

Meu problema é que isso muda a cor do espaço ao redor da trama. Como alterar a cor real do plano de fundo da plotagem?

user1764386
fonte
9
Apenas para sua informação, além do que o @Evert disse, você pode apenas usar ax.patch.set_facecolor('black')(onde axestá a instância dos eixos). fig.patché o fundo da figura e ax.patché o fundo dos eixos.
precisa

Respostas:

230

Use o set_facecolor(color)método do axesobjeto , que você criou de uma das seguintes maneiras:

  • Você criou uma figura e um eixo / es juntos

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Você criou uma figura e depois eixo / es mais tarde

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • Você usou a API stateful (se estiver fazendo algo além de algumas linhas, e especialmente se tiver várias plotagens, os métodos orientados a objetos acima tornam a vida mais fácil, pois você pode consultar figuras específicas, plotar em determinados eixos e personalizar ou)

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

Então você pode usar set_facecolor:

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

plotagem de exemplo com fundo rosa nos eixos

Como uma atualização de quais cores podem ser:

matplotlib.colors

O Matplotlib reconhece os seguintes formatos para especificar uma cor:

  • uma tupla RGB ou RGBA de valores flutuantes em [0, 1](por exemplo, (0.1, 0.2, 0.5)ou (0.1, 0.2, 0.5, 0.3));
  • uma sequência hexadecimal RGB ou RGBA (por exemplo, '#0F0F0F'ou '#0F0F0F0F');
  • uma representação de string de um valor flutuante em [0, 1]inclusive para o nível de cinza (por exemplo, '0.5');
  • um de {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • um nome de cor X11 / CSS4;
  • um nome da pesquisa de cores xkcd ; prefixado com 'xkcd:'(por exemplo, 'xkcd:sky blue');
  • uma das {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}cores do Tableau da paleta categórica 'T10' (que é o ciclo de cores padrão);
  • uma especificação de cor “CN”, ou seja, 'C' seguida por um único dígito, que é um índice no ciclo de propriedades padrão ( matplotlib.rcParams['axes.prop_cycle']); a indexação ocorre no momento da criação do artista e o padrão é preto se o ciclo não incluir cores.

Todas as especificações de sequência de cores, exceto "CN", não diferenciam maiúsculas de minúsculas.

Nick T
fonte
Se houver outra maneira comum de gerar eixos, me avise.
Nick T
Parece que este método desapareceu em algum momento ao longo dos últimos 3 anos ... MethodNotFound
Demis
@ Demis este método foi adicionado nos últimos anos. Consulte a resposta do ImportanceOfBeingEarnest para saber como fazer isso em versões mais antigas.
Nick T
47

Um método é definir manualmente o padrão para a cor de plano de fundo do eixo em seu script (consulte Personalizando o matplotlib ):

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

Isso contrasta com o método de Nick T, que altera a cor de fundo de um axesobjeto específico . A redefinição dos padrões é útil se você estiver criando vários gráficos diferentes com estilos semelhantes e não quiser continuar alterando axesobjetos diferentes .

Nota: O equivalente a

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

da sua pergunta é:

plt.rcParams['figure.facecolor'] = 'black'
BurlyPaulson
fonte
41

Algo assim? Use a axisbgpalavra-chave para 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')

(Concedido, não um gráfico de dispersão e nem um fundo preto.)

insira a descrição da imagem aqui


fonte
3
Eu tive sucesso plt.subplot('111', axisbg='black')antes dos comandos de plotagem, usando o Windows.
heltonbiker
10
A axis_bg axis_bgcolorforam preterido no matplotlib 2.0.0 e removido em matplotlib 2.2.0
RubenLaguna
13

Se você já possui um axesobjeto, como na resposta de Nick T , também pode usar

 ax.patch.set_facecolor('black')
Mathias711
fonte
12

Uma sugestão em outras respostas é usar ax.set_axis_bgcolor("red"). No entanto, isso foi preterido e não funciona em MatPlotLib> = v2.0.

Há também a sugestão de usar ax.patch.set_facecolor("red")(funciona no MatPlotLib v1.5 e v2.2). Enquanto isso funciona bem, uma solução ainda mais fácil para a v2.0 + é usar

ax.set_facecolor("red")

ImportanceOfBeingErnest
fonte
FYI, ax.set_axis_bgcolor("black")funciona em Python v2.7.14 / MPL v1.5.1, mas ax.set_facecolor()não. Em algum lugar entre MPL v1.5.1 e v2.2.0, a função apropriada foi alterada.
Demis
1
@ Demis Se você precisar de uma solução que funcione em todas as versões, use ax.patch.set_facecolor("red"). Porca de matplotlib 2.0 da maneira recomendada é ax.set_facecolor.
ImportanceOfBeingErnest
4

O mais fácil é provavelmente fornecer a cor quando você criar o gráfico:

fig1 = plt.figure(facecolor=(1, 1, 1))

ou

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))
Flonks
fonte
Isso muda apenas a cor de fundo da janela, e não a cor real da plotagem
Tom Cupis
1

resposta mais simples:

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