画矩形树图
矩形效果图
代码及部分说明
-
dpi改变大小设置分辨率
-
rangestart=1,改变1值可以移动颜色范围
-
Spectral,使用的是Spectral颜色条色系颜色
- 颜色条
- 内含有
['viridis', 'plasma', 'inferno', 'magma', 'cividis']、['PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu', 'RdYlBu', 'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic']
等很多颜色条
-
threshold = 15 长度大于threshold的标签转换为一定格式的标签,避免越界,可适当修改其大小
-
alpha=.9,alpha是透明度,范围在 0-1之间
-
fontsize设置字体大小
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 16 18:44:55 2021
@author: Azuresky
"""
import numpy as np
import matplotlib.pyplot as plt
import squarify
import pandas as pd
import matplotlib as mpl
import matplotlib.patches as patches
import matplotlib.font_manager as fm
x=0; y=0
width = 2; height = 1 #四个参数控制矩形
data=pd.read_excel("E:/BaiduSyncdisk/SXFEL/others/肖庆雯/绘图/data.xlsx") #导入排序之后的数据
data.head()#可注释
df = data #df和data是一样的
print(data) #输出data检查有无问题
#图片显示中文
plt.rcParams['font.sans-serif']=['SimHei'] #字体设置
plt.rcParams['axes.unicode_minus'] =False #减号unicode编码
# df = data.groupby('Name').size().reset_index(name='2020')
# labels = df.apply(lambda x: str(x[0]) + "/n (" + str(x[1]) + ")", axis=1)
# print(labels)
# labels = df.apply(lambda x: str([i + '...' for i in [x[0][:8]] if len(x[0])>8][0]) + "/n (" + str(x[1]) + ")", axis=1)
threshold = 15 #长度大于threshold的标签转换为一定格式的标签,避免越出矩形边界
labels = []
allpeople = sum(data['2020']) #对'people'人数进行求和,为了显示百分比
print(allpeople) #输出总人数
# 以下for循环为修改标签格式,超过一定长度的标签,替换为i[:threshold] + '...' + 'people'
for i , k in zip(data['Name'],data['2020']):
if len(i) > threshold:
j = i[:threshold] + '...' + "\n (" + str(k) + ")"
#j = i[:threshold] + '...' + "\n (" + str('{:.2%}'.format(k/allpeople)) + ")"
labels.append(j)
else:
j = i + "\n (" + str(k) + ")"
#j = i + "\n (" + str('{:.2%}'.format(k/allpeople)) + ")"
labels.append(j)
sizes = df['2020'].values.tolist() #标签的大小
#sizes.sort(reverse=True) #True False
indextosize = df['2020'].values.tolist() #可注释掉,原本希望通过找到size排序后对应的labels,后面发现可以先在Excel中排序,甚至利用pd.sort_values(by="A",inplace=True,ascending=False)排序后处理
#print([indextosize.index(sizes[i]) for i in range(len(sizes))])
print(len(labels)) #输出查看有多少个label
#print(sizes)
rangestart = 1
colors = [plt.cm.Spectral(i/float(len(labels))) for i in range(rangestart,rangestart+len(labels))] #给出每一个矩形的颜色,使用Spectral颜色条
#以下代码为提高矩形树图的可操作性
sizes = squarify.normalize_sizes(sizes, width, height) # 根据设置的总体宽高正态化/归一化数据
rects_data = squarify.squarify(sizes, x, y, width, height) # Squarify算法计算出所有矩形的数据,利用Rectangle重新画图
fig, ax = plt.subplots(1, figsize=(15, 15 * height / width),dpi = 100) #设置图形
ax.set_xlim(x, width)
ax.set_ylim(y, height)
#读取squarify给出的所有矩形的数据,并作图
for i, r in enumerate(rects_data):
rect = patches.Rectangle((r["x"], r["y"]), r["dx"], r["dy"], linewidth=2, edgecolor="white", facecolor=colors[i],alpha=.9) #edgecolor="white"是边框颜色,facecolor=colors[i]是矩形内颜色,alpha=.9是透明度
ax.add_patch(rect)
#以下为添加标签,根据矩形大小改变标签大小及位置
if i < 6: #第40个矩形钱的标签用白色画
plt.text(
r["x"] + r["dx"] / 2, # rect的水平中心
r["y"] + r["dy"] / 2, # rect的垂直中心
labels[i],
ha="center",# 居中
va="center",# 居中
multialignment="center",# 居中
color = 'white',
fontsize=80 * r["dx"] / (width * height),
)
else: #之后的标签用黑色画
plt.text(
r["x"] + r["dx"] / 2, # rect的水平中心
r["y"] + r["dy"] / 2, # rect的垂直中心
labels[i],
ha="center",# 居中
va="center",# 居中
multialignment="center",# 居中
color = 'black',
fontsize=80 * r["dx"] / (width * height),
)
pass
ax.set_xticks([])
ax.set_yticks([])
pass
plt.title('Affiliation and number distribution',fontsize=30) #整个图的标题
plt.axis('off')#不显示坐标框
plt.show()#显示图
plt.savefig("E:/BaiduSyncdisk/SXFEL/绘图/TreeChart9.png")
表格内容
Name | 2020 |
---|---|
EDWARD AKWASI BOATENG | 150 |
MARGARET LANDER | 194 |
SHEILA ANERLEY | 73 |
LEE CHIA I | 292 |
MATILDA NAA KORKOI ALI SWELL | 67 |
KAWADA HANAE | 66 |
ANASTASIA | 165 |
MULUMEBET | 60 |
ALFUCENE BARI CAMARA | 54 |
LINA | 54 |
RAFFI | 49 |
MAVIS AWONPOK AKANBONG | 46 |