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找出文件中使用率最高的汉字实例详解
Jun 03 Python
Django开发中复选框用法示例
Mar 20 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
python实现简单flappy bird
Dec 24 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
新手学python应该下哪个版本
Jun 11 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
Django开发RESTful API实现增删改查(入门级)
May 10 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
ExtJS 入门
2010/10/29 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
python编写简单爬虫资料汇总
2016/03/22 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
怎么写好自荐书
2014/03/02 职场文书
南湾猴岛导游词
2015/02/09 职场文书
python字符串常规操作大全
2021/05/02 Python
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis