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 相关文章推荐
用pickle存储Python的原生对象方法
Apr 28 Python
Python编程之序列操作实例详解
Jul 22 Python
Python构建网页爬虫原理分析
Dec 19 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
Python通用函数实现数组计算的方法
Jun 13 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
Python Http请求json解析库用法解析
Nov 28 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 Python
Python 数据可视化工具 Pyecharts 安装及应用
Apr 20 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
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Python读写docx文件的方法
2018/05/08 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
基于树莓派的语音对话机器人
2019/06/17 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
keras导入weights方式
2020/06/12 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
护士自荐信范文
2013/12/15 职场文书
应届生如何写自荐信
2014/01/05 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
党支部鉴定意见
2015/06/02 职场文书