Gerando um gráfico com múltiplos (conjuntos de vários conjuntos de conjuntos de dados de vários conjuntos de vários)
-
12-09-2019 - |
Pergunta
Estou procurando uma maneira de gerar um gráfico com vários conjuntos de dados no eixo x, cada um dos quais é dividido em vários conjuntos de vários conjuntos. Eu basicamente quero levar este gráfico e coloque gráficos semelhantes lado a lado com ele. Estou tentando representar graficamente o gráfico de um gráfico da duração (eixo y) dos mesmos trabalhos (0-3) com diferentes configurações (0-1) em vários servidores (cada grupo com os mesmos 8 trabalhos). Espero que o diagrama a seguir ilustre o que estou tentando realizar (agrupamentos menores são separados por tubos, agrupamentos maiores por tubos duplos):
|| 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 ||
Isso é possível com o módulo GD :: Graph Perl ou o módulo Matplotlib Python? Não consigo encontrar exemplos ou documentação sobre esse assunto.
Solução
Aqui está algum código Python que produzirá o que você está procurando. (O exemplo usa 3 configurações em vez de 2 para garantir que o código fosse bastante geral.)
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 é provavelmente bastante transparente. O termo ímpar (iconfig+2.)/(nconfigs+1)
é apenas para diminuir as cores para as diferentes configurações, mas mantenha -as brilhantes o suficiente para que as cores possam ser distinguidas.
A saída se parece: