Python 绘制具有不等元素的杆组
免责声明:也许我的研究不够,但我没有找到一个完全适合我的问题的答案 我有一套特定大小的数据集,这些数据集是在不同年份提供的。 例如,在2005年,我们有数据集A(大小500)、B(大小100)和C(大小789),然后在2013年,我们有数据集H(大小1500)、I(大小300)和J(大小47) 我希望在垂直YY轴上有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
尺寸
,而水平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()