Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案


Posted in Python onApril 20, 2022

通过Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案。主要原因是有些论文打印出是黑白色的,不同类别之间区分不明显,所以做了这种方案。

存在一个问题:不知道如何根据填充图案设置图例,本文中可谓“曲线救国”,将图例的颜色块设置为了白色,所以如果有人知道如何根据hatching设置图例可以讨论,原始的legend方法中是未提供该类参数的。

图形如下:

Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案

代码如下

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.ticker as mtick
from matplotlib.ticker import PercentFormatter

#设置填充的图案
marks = ['o','/','*','..','\\'] 
labels = [i for i in range(2010, 2021)]
#数据
first = [42.85,    41.15,39.41,35.35,35.53,30.45,29.81,31.85,32.41,30.42,31.49]
second = [23.20,26.40,27.77,29.02,32.30,35.40,36.42,35.95,35.45,34.00,31.93]
third = [14.08,12.99,12.51,11.54,11.70,12.27,12.69,11.81,10.63,9.98,9.95]
fourth = [16.14,16.17,17.34,21.53,17.66,19.36,18.40,17.83,19.15,23.09,24.10]
others = [3.73,3.28,2.98,2.57,2.81,2.53,2.67,2.57,2.36,2.51,2.54]
data = [first, second, third, fourth, others]

x = range(len(labels))

width = 0.35
# 将bottom_y元素都初始化为0
bottom_y = np.zeros(len(labels))
data = np.array(data)
# 为计算百分比做准备
sums = np.sum(data, axis=0)
j = 0
figsize = 8,6
figure, ax = plt.subplots(figsize=figsize)
plt.rcParams['font.sans-serif'] = ['SimHei']
for i in data:
    y = i / sums
    plt.bar(x, y, width, hatch=np.array(marks)[j], bottom=bottom_y, color='white', edgecolor='black')
    bottom_y = y + bottom_y
    plt.xticks(x, labels)
    #plt.yticks(range(1), ylabel)
    legend_labels = ['o legend1', '/ legend2', '* legend3', '· legend4',r'\ legend5']  
    color = ['white', 'white', 'white', 'white', 'white']
   
    patches = [mpatches.Patch(color=color[h],label="{:s}".format(legend_labels[h])) for h in range(len(legend_labels))]
    ax = plt.gca()
    box = ax.get_position()

    #纵轴设置为百分比
    plt.gca().yaxis.set_major_formatter(PercentFormatter(1))

    ax.legend(handles=patches,ncol=1, bbox_to_anchor=(1, 1), borderaxespad = 0.)  # 生成legend
    figure.subplots_adjust(right=0.7)
    j+=1
#绘制平行于x轴的虚线
for i in range(1, 11, 1):
    plt.axhline(y=i/10, linestyle='dashed', color='black', linewidth=0.5)
labels = ax.get_xticklabels() + ax.get_yticklabels()
#设置数字label字体
[label.set_fontname('Times New Roman') for label in labels]
plt.savefig(r'filename.svg', format='svg')
plt.show()

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
好的Python培训机构应该具备哪些条件
May 23 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
Django 项目重命名的实现步骤解析
Aug 14 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
Python线程指南分享
Nov 19 Python
pytorch梯度剪裁方式
Feb 04 Python
Python3列表List入门知识附实例
Feb 09 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 Python
Pandas 数据编码的十种方法
Apr 20 #Python
Python读取和写入Excel数据
Python 的演示平台支持 WSGI 接口的应用
Apr 20 #Python
python​格式化字符串
Apr 20 #Python
Python编写冷笑话生成器
Apr 20 #Python
Python Django / Flask如何使用Elasticsearch
Apr 19 #Python
python中mongodb包操作数据库
Apr 19 #Python
You might like
PHP 超链接 抓取实现代码
2009/06/29 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
actionscript与javascript的区别
2011/05/25 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
webpack4+react多页面架构的实现
2018/10/25 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
python 把数据 json格式输出的实例代码
2016/10/31 Python
Python运算符重载详解及实例代码
2017/03/07 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
详解python datetime模块
2020/08/17 Python
python 监控logcat关键字功能
2020/09/04 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
别名指示符是什么
2012/10/08 面试题
投标保密承诺书
2014/05/19 职场文书
小学课外阅读总结
2014/07/09 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
法定代表人身份证明书
2015/06/18 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang