嵌套饼图,扇区的子分区数量可变

人工智能 2026-07-09

我在使用: https://matplotlib.org/stable/gallery/pie_and_polar_charts/nested_pie.html

不过,我把它输入为一个不规则数组的形式(通过零填充),把它矩形化成一个矩阵。

换言之

from tensorflow.keras.utils import pad_sequences as ps
vals = np.array(np.array(ps([[9.0, 8.0, 8.0], [2.0, 7.0, 8.0, 8.0], [6.0, 6.0, 8.0, 5.0], [2.0, 4.0, 10.0, 4.0, 5.0]]
)))

不幸的是,这会导致颜色区段的排序(每个区段的特定色相,按每个子区段的不同明度分层)变得混乱:对于这种独特的数据,有什么想法可以重新排序新颜色吗?

我试过

tab20c = plt.color_sequences["tab20c"]
outer_colors = [tab20c[i] for i in [0, 4, 8, 12]]
inner_colors = [tab20c[i] for i in np.array(ps([[9.0, 8.0, 8.0], [2.0, 7.0, 8.0, 8.0], [6.0, 6.0, 8.0, 5.0], [2.0, 4.0, 10.0, 4.0, 5.0]])).flatten().astype(np.int64).tolist()]

但我现在意识到,实际上似乎会根据切片的维度来改变颜色,如果我没猜错的话。

至少我已经找到了通过硬编码把父区段的“匹配”颜色分配给每个子区段的方法:这应该会让最终实现的思路更清晰,我只需要以某种方式改变每个子区段的色调,并通过让脚本根据输入来调整数值数组来实现自动化。

outer_colors = [tab20c[i] for i in [0, 4, 8, 12]]
inner_colors = [tab20c[i] for i in [0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12]]

解决方案

这就是我最终实现所需要的功能的编码方式:

(附注:从 tensorflow 导入模块似乎要花很长时间,可能应该避免,但就我的用例而言,我为了节省实现我自己的算法的时间而这样做:将来我可能会再研究它)

import matplotlib.pyplot as plt
import numpy as np


import csv
from tensorflow.keras.utils import pad_sequences as ps
from matplotlib import colormaps
ls=list(csv.reader(open('t.csv'), quoting=csv.QUOTE_NONNUMERIC))
c1 = plt.colormaps["Reds"].resampled(10)
c2 = plt.colormaps["Blues"].resampled(10)
c3 = plt.colormaps["Greens"].resampled(10)
c4 = plt.colormaps["Purples"].resampled(10)
outer_colors = c1([5]), c2([5]), c3([5]), c4([5])
inner_colors= np.array([c1([0,2,4,6,8]), c2([0,2,4,6,8]), c3([0,2,4,6,8]), c4([0,2,4,6,8])]).reshape(-1, 4).tolist()


print(ps(ls).tolist())
print([str(x) for x in ps(ls).flatten().tolist()])



fig, ax = plt.subplots()

size = 0.3
vals = np.array(ps(ls))
outer_labels= [str(x) for x in np.arange(1,5).tolist()]
inner_labels = ["" if x==0 else str(x) for x in ps(ls).flatten().tolist()]
ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'), labels=outer_labels)

ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'), labels=inner_labels)

ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章