Squarify - 如何调整树状图矩形形状

如何解决Squarify - 如何调整树状图矩形形状

我在 squarify 的文档中找不到编辑树图中矩形形状的方法。我想将其中一个矩形显示为其他矩形之一的方形子集。这是我目前拥有的:

import squarify
from matplotlib import pyplot as plt

treemap_df = pd.DataFrame({
    'names': ['A','B','C'],'sizes': [25,50,75]
})

plt.figure(figsize=(10,4))
ax = squarify.plot(
    treemap_df.sizes,label=treemap_df.names,color=["red","green","grey"],alpha=.8,edgecolor="white",linewidth=4
)

# I can get the coordinates of the squares/patches like this:
for rect in ax.patches:
    x,y,w,h = rect.get_x(),rect.get_y(),rect.get_width(),rect.get_height()
    c = rect.get_facecolor()
    print(f'Rectangle x={rect.get_x()} y={rect.get_y()} w={rect.get_width()} h={rect.get_height()} ')
    
plt.axis('off')
plt.title('Basic Treemap')
plt.show()

这给了我以下输出

enter image description here

那么,假设我只想编辑绘图,使矩形“A”是一个正方形——有没有办法做到这一点?理想情况下,我希望形状 'B' 甚至不是正方形,而是看起来像 'A' 是矩形 'B' 的插入(然后在其实际足迹中具有 L 形状),但只是能够完全调整矩形形状/位置会很棒。谢谢。

解决方法

以下方法首先遍历矩形并保存矩形AB的位置。

然后,A 的宽度和高度被修改为其乘积的平方根。

基于AB的坐标,复制B的属性,创建了一个新的L形多边形。之后,B 被删除。

注意以下代码仅适用于AB的特定位置。其他位置需要有点不同的 L 形,否则可能是不可能的。

另请注意,要使正方形看起来像正方形,则需要具有相等的纵横比。 Squarify 使用参数 norm_xnorm_y,默认为 100,它们是周围矩形的尺寸。您可以将它们更改为具有不同的纵横比,但请注意,这可能会更改生成的矩形的位置。

import squarify
from matplotlib import pyplot as plt
from matplotlib.patches import Polygon
from math import sqrt

names = ['A','B','C']
sizes = [25,50,75]

plt.figure(figsize=(8,6))
ax = squarify.plot(
    sizes,norm_x=100,norm_y=100,label=names,color=["red","green","grey"],alpha=.8,edgecolor="white",linewidth=4)

for rect,name in zip(ax.patches,names):
    (x,y),w,h = rect.get_xy(),rect.get_width(),rect.get_height()
    c = rect.get_facecolor()
    print(f'Rectangle {name} x={rect.get_x()} y={rect.get_y()} w={rect.get_width()} h={rect.get_height()} ')
    if name == 'A':
        rect_for_square = rect
        sq_size = sqrt(w * h)
        xa,ya = x,y
    if name == 'B':
        rect_for_L = rect
        xb,yb,wb,hb = x,y,h

rect_for_square.set_width(sq_size)
rect_for_square.set_height(sq_size)
points = [[xb,ya + sq_size],[xb,yb + hb],[xb + wb,ya],[xb + sq_size,ya + sq_size]]

poly_L = Polygon(points,closed=True)
poly_L.update_from(rect_for_L) # copy colors,alpha,linewidths,...
ax.add_patch(poly_L)

rect_for_L.remove()

ax.set_aspect('equal')
plt.axis('off')
plt.show()

resulting plot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?