python 画矩形树图

画矩形树图

矩形效果图

在这里插入图片描述
在这里插入图片描述

代码及部分说明

  • 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")

表格内容

Name2020
EDWARD AKWASI BOATENG150
MARGARET LANDER194
SHEILA ANERLEY73
LEE CHIA I292
MATILDA NAA KORKOI ALI SWELL67
KAWADA HANAE66
ANASTASIA165
MULUMEBET60
ALFUCENE BARI CAMARA54
LINA54
RAFFI49
MAVIS AWONPOK AKANBONG46
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值