繁体   English   中英

Squarify treemap — 如何为太小的矩形添加图例?

[英]Squarify treemap — How to add legend for rectangles that are too small?

我的树形图有一个矩形太小,无法容纳其 label,因此我需要将树形图中的标签移出图例。 我正在使用norm_x ,因为我正在尝试模拟温度计式 plot。 下面看一下代码和尴尬的label:

sizes = [30, 15, 3]
        
labels = [
    'Largest Block\n(30 units)',
    'Second Largest Block\n(15 units)',
    'Small Block\n(3 units)'
]     
            
tmap = squarify.plot(
    sizes,
    label=labels,
    alpha=.7,
    norm_x=10,
)

tmap.axes.get_xaxis().set_visible(False)
    
plt.legend(labels)

产生:

在此处输入图像描述

当我添加plt.legend(labels) (并从 squarify 调用中删除标签)时,我得到这个图例只有一个 label:

在此处输入图像描述

所以我只需要找到一种方法将 plot 中的所有标签添加到图例中。 matplotlib 文档建议我可能需要在plt.legend()调用中添加三位艺术家,但在这种情况下我不确定如何执行此操作。 此外,如果您有比创建图例更好的想法来解决此问题,那可能是一个更好的答案。

这些矩形一起存储在BarContainer中。 默认情况下,matplotlib 假设一个图例 label 用于完整的容器。 要为每个单独的矩形添加图例 label,您可以将BarContainer作为句柄传递给plt.legend()

下面的示例代码明确分配了 colors,因为默认的 colors 可能有点难以区分。

from matplotlib import pyplot as plt
import squarify

sizes = [30, 15, 3]
labels = ['Largest Block\n(30 units)', 'Second Largest Block\n(15 units)', 'Small Block\n(3 units)']

ax = squarify.plot(sizes, alpha=.7, norm_x=10, color=plt.cm.Set2.colors)
ax.get_xaxis().set_visible(False)
from matplotlib import pyplot as plt
import squarify

sizes = [30, 15, 3]
labels = ['Largest Block\n(30 units)', 'Second Largest Block\n(15 units)', 'Small Block\n(3 units)']

ax = squarify.plot(sizes, norm_x=10, color=plt.cm.Set2.colors)
ax.get_xaxis().set_visible(False)

plt.legend(handles=ax.containers[0], labels=labels)
plt.show()

结果图

PS:要使图例与显示的矩形顺序相同,您可以反转 y 轴( ax.invert_yaxis() )或反转句柄和标签列表( plt.legend(handles=ax.containers[0][::-1], labels=labels[::-1]) )。

这是另一个示例,注释 plot 内的最大矩形并在图例中显示最小的矩形:

from matplotlib import pyplot as plt
import squarify
import numpy as np

labels = [55, 34, 21, 13, 8, 5, 3, 2, 1, 1]
sizes = [f * f for f in labels]
num_labels_in_legend = 5

ax = squarify.plot(sizes, label=labels[:-num_labels_in_legend], color=plt.cm.plasma(np.linspace(0, 1, len(labels))),
                   ec='black', norm_x=144, norm_y=89, text_kwargs={'color': 'white', 'size': 18})
ax.axis('off')
ax.invert_xaxis()
ax.set_aspect('equal')
plt.legend(handles=ax.containers[0][:-num_labels_in_legend - 1:-1], labels=labels[:-num_labels_in_legend - 1:-1],
           handlelength=1, handleheight=1)
plt.show()

第二个例子

这是计算要在图例中显示的标签数量的想法。 例如,当小矩形的总面积小于总面积的 5% 时:

num_labels_in_legend = np.count_nonzero(np.cumsum(sizes) / sum(sizes) > 0.95)

或者只是小于总面积 2% 的矩形数量:

num_labels_in_legend = np.count_nonzero(np.array(sizes) / sum(sizes) < 0.02)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM