web-dev-qa-db-fra.com

Python Matplotlib Boxplot Color

J'essaie de faire deux ensembles de boîtes à moustaches en utilisant Matplotlib. Je veux que chaque ensemble de parcelles soit rempli (et les points et les moustaches) dans une couleur différente. Donc, fondamentalement, il y aura deux couleurs sur l'intrigue

Mon code est ci-dessous, ce serait génial si vous pouvez aider à rendre ces tracés en couleur. d0 et d1 sont chacune une liste de listes de données. Je veux que l'ensemble des boîtes à moustaches soit composé de données dans d0 en une seule couleur, et l'ensemble des boîtes à moustaches avec des données dans d1 dans une autre couleur.

plt.boxplot(d0, widths = 0.1)
plt.boxplot(d1, widths = 0.1)
12
user58925

Vous pouvez modifier la couleur d'un diagramme à l'aide de setp sur la valeur renvoyée de boxplot() comme suit:

import matplotlib.pyplot as plt

def draw_plot(data, Edge_color, fill_color):
    bp = ax.boxplot(data, patch_artist=True)

    for element in ['boxes', 'whiskers', 'fliers', 'means', 'medians', 'caps']:
        plt.setp(bp[element], color=Edge_color)

    for patch in bp['boxes']:
        patch.set(facecolor=fill_color)       

example_data1 = [[1,2,0.8], [0.5,2,2], [3,2,1]]
example_data2 = [[5,3, 4], [6,4,3,8], [6,4,9]]

fig, ax = plt.subplots()
draw_plot(example_data1, 'red', 'tan')
draw_plot(example_data2, 'blue', 'cyan')
ax.set_ylim(0, 10)
plt.show()

Cela s'afficherait comme suit: box plot demo

17
Martin Evans

Pour coloriser le boxplot, vous devez d'abord utiliser le mot clé patch_artist=True Pour lui dire que les cases sont des patchs et pas seulement des chemins. Ensuite, vous avez deux options principales ici:

  1. définissez la couleur via l'argument de mot clé ...props, par exemple.
    boxprops=dict(facecolor="red"). Pour tous les arguments de mots clés, reportez-vous à la documentation
  2. Utilisez la fonctionnalité plt.setp(item, properties) pour définir les propriétés des boîtes, des moustaches, des dépliants, des médianes, des bouchons.
  3. obtenir les éléments individuels des boîtes du dictionnaire renvoyé et utiliser item.set_<property>(...) sur eux individuellement. Cette option est détaillée dans une réponse à la question suivante: boxplots remplis par python matplotlib , où elle permet de changer la couleur des cases individuelles séparément.

L'exemple complet, montrant les options 1 et 2:

import matplotlib.pyplot as plt
import numpy as np
data = np.random.normal(0.1, size=(100,6))
data[76:79,:] = np.ones((3,6))+0.2

plt.figure(figsize=(4,3))
# option 1, specify props dictionaries
c = "red"
plt.boxplot(data[:,:3], positions=[1,2,3], notch=True, patch_artist=True,
            boxprops=dict(facecolor=c, color=c),
            capprops=dict(color=c),
            whiskerprops=dict(color=c),
            flierprops=dict(color=c, markeredgecolor=c),
            medianprops=dict(color=c),
            )


# option 2, set all colors individually
c2 = "purple"
box1 = plt.boxplot(data[:,::-2]+1, positions=[1.5,2.5,3.5], notch=True, patch_artist=True)
for item in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
        plt.setp(box1[item], color=c2)
plt.setp(box1["boxes"], facecolor=c2)
plt.setp(box1["fliers"], markeredgecolor=c2)


plt.xlim(0.5,4)
plt.xticks([1,2,3], [1,2,3])
plt.show()

enter image description here

15

Cette question semble être similaire à celle-là ( motif de visage pour les boîtes dans les boîtes à moustaches ) J'espère que ce code résout votre problème

import matplotlib.pyplot as plt

# fake data
d0 = [[4.5, 5, 6, 4],[4.5, 5, 6, 4]]
d1 = [[1, 2, 3, 3.3],[1, 2, 3, 3.3]]

# basic plot
bp0 = plt.boxplot(d0, patch_artist=True)
bp1 = plt.boxplot(d1, patch_artist=True)

for box in bp0['boxes']:
    # change outline color
    box.set(color='red', linewidth=2)
    # change fill color
    box.set(facecolor = 'green' )
    # change hatch
    box.set(hatch = '/')

for box in bp1['boxes']:
    box.set(color='blue', linewidth=5)
    box.set(facecolor = 'red' )

plt.show()

enter image description here

2
Roman Fursenko

Changer la couleur d'un boxplot

import numpy as np 
import matplotlib.pyplot as plt

#generate some random data
data = np.random.randn(200)
d= [data, data]
#plot
box = plt.boxplot(d, showfliers=False)
# change the color of its elements
for _, line_list in box.items():
    for line in line_list:
        line.set_color('r')

plt.show()

enter image description here

0
Amjad