Python 如何向树映射中的每个矩形添加子图?

Python 如何向树映射中的每个矩形添加子图?,python,matplotlib,data-visualization,squarify,Python,Matplotlib,Data Visualization,Squarify,我使用Matplotlib和Squarify创建了此树地图: 现在,我想在树形图中的每个矩形上添加一个线图。有可能吗?是的,有可能。您必须编写代码以提取要放置新绘图的确切位置 您需要使用f.canvas.manager.window.SetPosition 这个答案将大大有助于的绘图是一个方便的函数,可以直接绘制给定值和标签的树形图。但是,这个过程也可以逐步执行。其中一个步骤是计算矩形的位置,我们假设一个从左下角到右上角坐标为0,0到1,1的图形 使用这些矩形,我们可以手动定位要绘制的轴。目前

我使用Matplotlib和Squarify创建了此树地图:


现在,我想在树形图中的每个矩形上添加一个线图。有可能吗?

是的,有可能。您必须编写代码以提取要放置新绘图的确切位置

您需要使用
f.canvas.manager.window.SetPosition

这个答案将大大有助于

的绘图是一个方便的函数,可以直接绘制给定值和标签的树形图。但是,这个过程也可以逐步执行。其中一个步骤是计算矩形的位置,我们假设一个从左下角到右上角坐标为0,0到1,1的图形

使用这些矩形,我们可以手动定位要绘制的轴。目前尚不清楚是否需要蜱。如果需要的话,他们可以。或者可以将轴完全移动到每个子批次的中心。或者只有没有标签的记号

下面是一些演示代码:

将numpy导入为np
将matplotlib.pyplot作为plt导入
进口鳞片
值=[500433313254119]
value.sort(reverse=True)#值必须按降序(和正序)排序
#这些值的总和必须等于要布置的总面积;i、 例如,总和(值)=宽度*高度
值=平方。规格化大小(值,1,1)
矩形=squarify.squarify(值0,0,1,1)
图=plt.图(图尺寸=(7,5))
轴=[图为矩形中的矩形添加_轴([rect['x']、rect['y']、rect['dx']、rect['dy']、])]
对于ax,拉链中的颜色(轴,plt.cm.Pastel1.colors):
x=np.linspace(0,10100)
y=np.随机.正态(0.01,0.1100).cumsum()
轴图(x,y)
最大勾选参数(轴=“y”,方向=“in”,焊盘=-15)
最大勾选参数(轴=“x”,方向=“in”,焊盘=-15)
plt.setp(ax.get_yticklabels(),ha=“left”)
ax.设置面颜色(颜色)
plt.show()

这是另一个与问题中的图像相似的示例,有一个主图和一个色条。默认的mplcursors会与所有这些轴混淆,但也可以手动添加

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

values = [4000, 1500, 1500, 1200, 1000, 500]

fig, mainax = plt.subplots(figsize=(6, 4))

mainax.set_xlim(0, 1000)
mainax.set_ylim(0, 1000)
mainax.grid(False)
cmap = plt.cm.get_cmap('Greens')
norm = plt.Normalize(vmin=0, vmax=max(values))
plt.colorbar(plt.cm.ScalarMappable(cmap=cmap, norm=norm))
pos = mainax.get_position()

values.sort(reverse=True)
normalized_values = squarify.normalize_sizes(values, pos.width, pos.height)
rects = squarify.squarify(normalized_values, pos.x0, pos.y0, pos.width, pos.height)

axes = [fig.add_axes([rect['x'], rect['y'], rect['dx'], rect['dy'], ]) for rect in rects]

for ax, val in zip(axes, values):
    x = np.linspace(0, 10, 100)
    y = np.random.normal(0.01, 0.1, 100).cumsum()
    ax.plot(x, y)
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_facecolor(cmap(norm(val)))
mainax.set_facecolor('none') # prevent that the mainax blocks the other axes
mainax.set_zorder(20) # high z-order because the annotations are drawn using this ax

labels = ['a', 'b', 'c', 'd', 'e', 'f']
sum_val = sum(values)
annotations = [mainax.annotate(f"'{lbl}': {val}\n{val * 100.0 / sum_val:.1f} %",
                               xy=(0, 0), xycoords='figure pixels',
                               xytext=(0, 0), textcoords='offset points',
                               bbox=dict(boxstyle='round', fc='lemonchiffon'),
                               ha='center', va='bottom')
               for ax, val, lbl in zip(axes, values, labels)]
for annot in annotations:
    annot.set_visible(False)

def hover(event):
    for ax, annot in zip(axes, annotations):
        if ax.bbox.contains(event.x, event.y):
            annot.xy = (event.x, event.y)
            annot.set_visible(True)
        else:
            annot.set_visible(False)
    fig.canvas.draw_idle()

fig.canvas.mpl_connect("motion_notify_event", hover)

plt.show()

那么我必须创建两个单独的图形并将其中一个移动到另一个上吗?我是否误解了问题中的某些内容?谢谢,这非常有帮助!现在我想在每个矩形中添加悬停文本。我找到的解决方案,包括你在另一篇文章中提供给我的解决方案,只有在我将鼠标悬停在图形的某个点上时才会显示文本。有没有办法将悬停区域设置为整个矩形?