Generación de un gráfico con múltiples conjuntos (conjuntos de múltiples conjuntos de múltiples) conjuntos de datos del eje X)
-
12-09-2019 - |
Pregunta
Estoy buscando una manera de generar un gráfico con múltiples conjuntos de datos en el eje X, cada uno de los cuales se divide en múltiples conjuntos de múltiples conjuntos. Básicamente quiero tomar este gráfico y coloque gráficos similares al lado de él. Estoy tratando de graficar el gráfico de construir un gráfico de la duración (eje y) de los mismos trabajos (0-3) con diferentes configuraciones (0-1) en múltiples servidores (cada grupo con los mismos 8 trabajos). Esperemos que el siguiente diagrama ilustra lo que estoy tratando de lograr (las agrupaciones más pequeñas están separadas por tuberías, agrupaciones más grandes por tuberías dobles):
|| 0 1 | 0 1 | 0 1 | 0 1 || 0 1 | 0 1 | 0 1 | 0 1 || 0 1 | 0 1 | 0 1 | 0 1 || || 0 | 1 | 2 | 3 || 0 | 1 | 2 | 3 || 0 | 1 | 2 | 3 || || Server 1 || Server 2 || Server 3 ||
¿Es esto posible con el módulo GD :: Graph Perl o el módulo Matplotlib Python? No puedo encontrar ejemplos o documentación sobre este tema para ninguno de los dos.
Solución
Aquí hay un código de Python que producirá lo que está buscando. (El ejemplo usa 3 configuraciones en lugar de 2 para asegurarse de que el código fuera bastante general).
import matplotlib.pyplot as plt
import random
nconfigs, njobs, nservers = 3, 4, 4
width = .9/(nconfigs*njobs)
job_colors = [(0,0,1), (0,1,0), (1,0,0), (1,0,1)]
def dim(color, fraction=.5):
return tuple([fraction*channel for channel in color])
plt.figure()
x = 0
for iserver in range(nservers):
for ijob in range(njobs):
for iconfig in range(nconfigs):
color = dim(job_colors[ijob], (iconfig+2.)/(nconfigs+1))
plt.bar(x, 1.+random.random(), width, color=color)
x += width
x += .1
plt.show()
Este código es probablemente bastante transparente. El término impar (iconfig+2.)/(nconfigs+1)
es solo para atenuar los colores para las diferentes configuraciones, pero manténgalos lo suficientemente brillantes para que los colores puedan distinguirse.
La salida parece: