HOWTO · Seaborn

Como criar um gráfico de violino com Seaborn

Este tutorial demonstra como criar um gráfico de violino usando o módulo Seaborn em Python

Nesta página

Um gráfico de violino do Seaborn mostra a distribuição estimada de uma variável numérica. Sua largura representa a densidade: regiões mais largas indicam uma densidade estimada maior em torno desses valores. As marcas internas resumem os dados; elas não mostram cada observação. O formato pode sugerir vários picos, mas deve ser interpretado considerando o tamanho da amostra e os dados subjacentes.

Entenda o que um gráfico de violino mostra

Um gráfico de violino combina uma forma de densidade com marcas de resumo opcionais. Como a densidade é estimada a partir das observações, o resultado é uma representação suavizada, não um histograma nem um conjunto de pontos brutos. Dependendo da configuração de inner, as marcas internas podem mostrar uma caixa, quartis, um traço para cada observação ou nenhum resumo.

O gráfico é útil para comparar o formato e a dispersão de distribuições numéricas. Por si só, ele não explica por que os dados têm aquele formato; além disso, uma amostra pequena pode fazer a densidade estimada parecer mais precisa ou detalhada do que as observações permitem.

Faça o gráfico de uma única variável

Passe uma sequência numérica para violinplot() para representar uma variável. Este exemplo independente usa diretamente uma lista do Python, sem precisar convertê-la em array. Antes de executá-lo, instale Seaborn e Matplotlib no ambiente Python. O código cria um Axes com a distribuição e não imprime texto.

import matplotlib.pyplot as plt
import seaborn as sns

values = [4, 5, 5, 6, 6, 7, 8, 8, 9, 10]
ax = sns.violinplot(y=values, inner="quartile", color="skyblue")
ax.set_ylabel("Value")
ax.set_title("Distribution of values")
plt.show()

O eixo vertical representa os valores. Uma parte mais larga do violino indica maior concentração estimada em torno daquele valor. Quando a amostra é pequena, examine as observações junto com o formato suavizado.

Compare distribuições entre categorias

Para comparar categorias, forneça a coluna numérica por meio de y e a coluna categórica por meio de x. O exemplo usa um DataFrame do pandas e associa Price a y e Product a x; assim, o eixo x apresenta uma categoria para cada produto. A chamada não inclui o argumento hue nem agrupa os dados por dia.

import pandas as pd
import seaborn as sns

prices = pd.DataFrame(
    {
        "Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
        "Product": ["A"] * 4 + ["B"] * 4 + ["A"] * 4 + ["B"] * 4,
    }
)
ax = sns.violinplot(data=prices, x="Product", y="Price")
ax.set_title("Price distribution by product")

Cada violino resume os preços associados àquele produto. Para acrescentar uma segunda dimensão de agrupamento, associe sua coluna a hue; cada nível de hue será então distinguido dentro das categorias do eixo x. Não descreva um agrupamento por dia, por exemplo, a menos que os dados representados e os argumentos realmente o incluam.

Personalize um gráfico de violino

A estimativa de densidade pode induzir a erro quando há poucas observações. Sobreponha stripplot() para tornar os valores individuais visíveis e compará-los com o formato suavizado. Os pontos ajudam a examinar a amostra, mas não tornam uma amostra pequena mais confiável.

import matplotlib.pyplot as plt
import seaborn as sns

values = [4, 5, 5, 6, 6, 7, 8, 8, 9, 10]
ax = sns.violinplot(y=values, inner=None, color="skyblue")
sns.stripplot(y=values, color="red", ax=ax)
ax.set_ylabel("Value")
plt.show()

Use order para escolher a ordem de exibição das categorias, por exemplo, order=["B", "A"]. Use inner para controlar as marcas de resumo; opções comuns incluem "box", "quartile", "stick" e None. Uma sobreposição de box plot pode acrescentar um resumo conhecido, mas continua representando a mesma amostra e não substitui a análise das observações.

Use o objeto retornado pelo gráfico

violinplot() retorna um Axes do Matplotlib, que você pode usar para definir rótulos, limites e um título ou acrescentar outras marcas. Por exemplo, o exemplo de uma única variável guarda o resultado em ax e chama ax.set_ylabel() e ax.set_title().

Para criar um gráfico categórico no nível da figura, use catplot(kind="violin", ...); a função retorna um FacetGrid. Essa interface é útil quando você quer criar painéis separados com opções como row ou col. Escolha violinplot() para um gráfico no nível dos eixos e catplot() quando precisar da grade no nível da figura.