生成多个(多组多组)X轴数据集的图表

3 投票
3 回答
1230 浏览
提问于 2025-04-15 13:26

我想找一种方法,生成一个图表,这个图表的X轴上有多个数据集,每个数据集又可以分成多个小组。简单来说,我想把这个图表放在一起,旁边再放上类似的图表。我想画出同样的工作(0-3)的持续时间(Y轴),这些工作在不同的配置(0-1)下,在多个服务器上运行(每组都有相同的8个工作)。希望下面的图示能帮助你理解我想要实现的目标(小组用竖线分隔,大组用双竖线分隔):

|| 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              ||

请问用GD::Graph这个Perl模块或者matplotlib这个Python模块能做到吗?我找不到相关的例子或文档。

3 个回答

0

MathGL 可以很轻松地做到这一点,而且它也有 Python 接口。你可以查看 这个链接 来看看示例。

0

最近,我看到一个图表,我觉得它可以满足你的需求,使用的是protovis这个工具。

我对这个程序没有经验,但这个图表让我大开眼界,我觉得它能帮到你。

6

这里有一些Python代码,可以帮你实现你想要的效果。(这个例子用了3种配置,而不是2种,目的是让代码更通用。)

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()

这段代码应该比较容易理解。里面有个奇怪的表达式(iconfig+2.)/(nconfigs+1),它的作用是让不同配置的颜色变得更淡一些,但又保持足够亮,以便能区分这些颜色。

输出的效果看起来像这样:

alt text

撰写回答