Python 绘制具有不等元素的杆组

Python 绘制具有不等元素的杆组,python,matplotlib,Python,Matplotlib,免责声明:也许我的研究不够,但我没有找到一个完全适合我的问题的答案 我有一套特定大小的数据集,这些数据集是在不同年份提供的。 例如,在2005年,我们有数据集A(大小500)、B(大小100)和C(大小789),然后在2013年,我们有数据集H(大小1500)、I(大小300)和J(大小47) 我希望在垂直YY轴上有尺寸,而水平XX轴是分层的:首先按年排序,每年按尺寸排序 此外,我希望将XX标签显示为格式为“YYYY数据集\ U名称”的字符串。 对于上面的示例,XX轴将按此顺序具有以下标签: 2

免责声明:也许我的研究不够,但我没有找到一个完全适合我的问题的答案

我有一套特定大小的数据集,这些数据集是在不同年份提供的。 例如,在2005年,我们有数据集A(大小500)、B(大小100)和C(大小789),然后在2013年,我们有数据集H(大小1500)、I(大小300)和J(大小47)

我希望在垂直YY轴上有
尺寸
,而水平XX轴是分层的:首先按
排序,每年按
尺寸
排序

此外,我希望将XX标签显示为格式为“YYYY数据集\ U名称”的字符串。 对于上面的示例,XX轴将按此顺序具有以下标签:

2005年B-100

2005年A-500

2005 C-789

2013年J-47

2013 I-300

2013年H-1500

从我发现的示例中,通常假设每个组中都存在相同的元素(如果是这样,每个数据集名称每年都会出现一次,但这不是我想要的)

从以下方面考虑此示例:

它生成以下绘图:

我的情节是这样的。 然而,并非所有变量都属于每一类。 它看起来是这样的:

年份将出现在单个粗体字母所在的位置。 这些年来的文本不一定是数字,它们可能是数据集名称

但是,我需要各组之间的间距相等,如图所示


感谢您的帮助。

我不久前确实解决了这个问题,但直到现在我才发布解决方案。 本质上,我使用了另一个StackOverflow用户的方法来进行分层条形图绘制:

def mk_groups(data: Dict) -> List:
    try:
        newdata = data.items()
    except:
        return

    thisgroup = []
    groups = []
    for key, value in newdata:
        newgroups = mk_groups(value)
        if newgroups is None:
            thisgroup.append((key, value))
        else:
            thisgroup.append((key, len(newgroups[-1])))
            if groups:
                groups = [g + n for n, g in zip(newgroups, groups)]
            else:
                groups = newgroups
    ret_val = [thisgroup] + groups

    return ret_val

def add_line(ax, xpos: float, ypos: float) -> None:
    line = plt.Line2D([xpos, xpos], [ypos + .1, ypos],
                      transform=ax.transAxes, color='black')
    line.set_clip_on(False)
    ax.add_line(line)

def get_hirarchy_element_count(data: Dict) -> int:
    acc = 0
    for _, val in data.items():
        if isinstance(val, collections.Mapping):
            sub_groug_count = get_hirarchy_element_count(val)
            acc = acc + sub_groug_count
        else:
            acc = acc + 1
    return acc

def get_group_color_list(data: Dict, colors: List) -> List:
    acc = 0
    ind = 0
    new_colors = []
    for _, val in data.items():
        if isinstance(val, collections.Mapping):
            sub_groug_count = get_hirarchy_element_count(val)
            new_colors = new_colors + [colors[ind]] * sub_groug_count
            ind = ind + 1
        else:
            acc = acc + 1
    return new_colors
使用这些函数,可以简单地定义一个字典字典,并像这样调用这些函数:

plot_map = {
    2004: {'dataset A': 50,'dataset B': 30,'dataset C': 70,'dataset ZZZ': 10,},
    2007: {'dataset 111': 80,'dataset B3': 5},
    2010: {'dataset solitude': 40},
    2015: {
        'Group A': {'x' : 40, 'y': 60}, 
        'Group B': {'x' : 45, 'y': 45}
    }
}

fig = plt.figure(figsize=(12, 6))
plt.suptitle('Each group with its own color')
ax = fig.add_subplot(1,1,1)

label_group_bar(ax, plot_map, per_group_coloring = True)
fig.subplots_adjust(bottom=0.3)
plt.xticks(rotation=90)
plt.ylabel("Yet another scale")

plt.show()
这将生成一个图形,其中每组条形图都有自己的颜色:

但是,如果希望每个条都有自己的颜色,可以执行以下操作:

fig = plt.figure(figsize=(12, 6))
plt.suptitle('Each bar with its own color')
ax = fig.add_subplot(1,1,1)

label_group_bar(ax, plot_map)
fig.subplots_adjust(bottom=0.3)
plt.xticks(rotation=90)
plt.ylabel("Yet another scale")

plt.show()


我希望这对其他人有用。

这是熊猫数据帧的实际结构吗?一列年份作为数字(2005),一列类别和值作为字符串(“B-100”)?然后必须首先创建matplotlib可以使用的数据帧。例如,有几种关于多索引标签的解决方案。我相信@Mr.T看起来是我最需要的。除了对于我的例子,所有的条都有不同的颜色,并且没有“Shelf”类别细分,在我的例子中只有两个级别:首先是年份,然后是数据集名称。
fig = plt.figure(figsize=(12, 6))
plt.suptitle('Each bar with its own color')
ax = fig.add_subplot(1,1,1)

label_group_bar(ax, plot_map)
fig.subplots_adjust(bottom=0.3)
plt.xticks(rotation=90)
plt.ylabel("Yet another scale")

plt.show()