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实现把回车符\r\n转换成\n
Apr 23 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
Python配置虚拟环境图文步骤
May 20 Python
python 实现让字典的value 成为列表
Dec 16 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
浅谈pandas dataframe对除数是零的处理
Jul 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
PHP中extract()函数的妙用分析
2012/07/11 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
python中Flask框架简单入门实例
2015/03/21 Python
Python作用域用法实例详解
2016/03/15 Python
Python应用库大全总结
2018/05/30 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
公司门卫的岗位职责
2014/02/19 职场文书
企业宗旨标语
2014/06/10 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书