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实现命令行版的火车票查看器
Aug 05 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
python2 与python3的print区别小结
Jan 16 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
运行django项目指定IP和端口的方法
May 14 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
django中media媒体路径设置的步骤
Nov 15 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
Django用户登录与注册系统的实现示例
Jun 03 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
python实现mean-shift聚类算法
2020/06/10 Python
如何完美的建立一个python项目
2020/10/09 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
Hibernate持久层技术
2013/12/16 面试题
给客户的道歉信
2014/01/13 职场文书
大学活动总结格式
2014/04/29 职场文书
共青团员自我评价范文
2014/09/14 职场文书
个人总结与自我评价
2014/09/18 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python