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如何使用unittest测试接口
Apr 04 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python斐波那契数列的计算方法
Sep 27 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
django和vue实现数据交互的方法
Aug 21 Python
简单的Python调度器Schedule详解
Aug 30 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
Python实现文字pdf转换图片pdf效果
Apr 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 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
js获取域名的方法
2015/01/27 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
使用Vue写一个datepicker的示例
2018/01/27 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
python实现倒计时的示例
2014/02/14 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Django中的Model操作表的实现
2018/07/24 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
python实现图片转字符小工具
2019/04/30 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
Python使用type动态创建类操作示例
2020/02/29 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
文明青少年标兵事迹材料
2014/01/28 职场文书
大学生励志演讲稿
2014/04/25 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL