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获得时间的实例说明
Mar 25 Python
Python日期的加减等操作的示例
Aug 15 Python
Python中enumerate函数代码解析
Oct 31 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
对于Python深浅拷贝的理解
Jul 29 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
python文件读取失败怎么处理
Jun 23 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
python之json文件转xml文件案例讲解
Aug 07 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 清除网页病毒的方法
2008/12/05 PHP
php中常用字符串处理代码片段整理
2011/11/07 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
python中pycurl库的用法实例
2014/09/30 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
python实现树形打印目录结构
2018/03/29 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
室内设计专业个人的自我评价
2013/10/19 职场文书
20岁生日感言
2014/01/13 职场文书
医学生求职自荐书
2014/06/12 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
高三教师工作总结2015
2015/07/21 职场文书
企业法律事务工作总结
2015/08/11 职场文书
阿里云日志过滤器配置日志服务
2022/04/09 Servers