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的函数嵌套的使用方法
Jan 24 Python
Python中的index()方法使用教程
May 18 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
详解python3百度指数抓取实例
Dec 12 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
利用Python如何生成便签图片详解
Jul 09 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
基于Python实现用户管理系统
Feb 26 Python
Python datetime模块使用方法小结
Jun 18 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
全面了解js中的script标签
2016/07/04 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
Python生成验证码实例
2014/08/21 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
Python利用命名空间解析XML文档
2020/08/10 Python
python 获取字典键值对的实现
2020/11/12 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
高中历史教学反思
2014/02/08 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
淘宝好评语句大全
2014/12/31 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书