python matplotlib 画棘状图和叠加柱状图
2022年1月2日更新:
# 绘制棘状图的函数
def jizhuangtu(b, colors=['#1f77b4','lightseagreen'], labels=None, title=None, text_on=True): # 绘制棘状图的函数'''b:Serie, 由groupby(x).y.values()得到colors:list, 分类的颜色(y轴分类)labels:list, 分类的标签(y轴分类)title:标签的名称/plt.legend的参数text_on:是否添加文字标签'''fig, ax = plt.subplots()for n, value in enumerate(b.index.levels[0]):c = b[value].sort_index()c = c/c.sum()globals()['width%s'%(n+1)] = b[value].sum()/b.sum() # 计算样本量占比 width1:男 width2:女globals()['x%s'%(n+1)] = 0 if n==0 else globals()['x%s'%n]+globals()['width%s'%(n)]/2+0.02+globals()['width%s'%(n+1)]/2 # 两个柱状图保留0.1的间隙plt.bar(globals()['x%s'%(n+1)], c.cumsum()[::-1], color=colors, width=globals()['width%s'%(n+1)])if text_on: # 如果text_on=True, 那么添加文字标签for h, s in zip(c[::-1], c):plt.text(globals()['x%s'%(n+1)], h, format(s, '.2%') ,horizontalalignment='center', verticalalignment='bottom')plt.ylim(0,1)plt.xlim(0-width1/2, globals()['x%s'%(n+1)]+globals()['width%s'%(n+1)]/2) # xn+widthn/2
# xticks = [i +'({:.2%})'.format(globals()['width%s'%(n+1)]) for n, i in enumerate(b.index.levels[0])] # 给x标签添加样本占比,添加占比太占位置了,且观看者可能难以理解plt.xticks([globals()['x%s'%(i)] for i in range(1, n+2)], b.index.levels[0])# 添加图例labels = b.index.levels[1] if labels==None else labels[plt.bar(0,0,color=colors[n], label=lab) for n,lab in enumerate(labels)]num1 = 1.01; num2 = 0.5; num3 = 3; num4 = 0plt.legend(bbox_to_anchor=(num1, num2), title=title, loc=num3, borderaxespad=num4)# 去掉边框for loc in ['top', 'left', 'bottom', 'right']:ax.spines[loc].set_visible(False)
jizhuang_data
jizhuangtu(jizhuang_data, labels=['逾期', '未逾期'])
之前的版本:
bar_data = pht.groupby('性别').是否为前线城市.value_counts().unstack().apply(lambda x: x/x.sum(), axis=1)
bar_data.plot(kind='bar', stacked=True)
bar_data
以前的版本:
写了一个可以画棘状图的函数
def jizhuangtu(b, colors=['#bebebe','#ffd700'], labels=None): # 绘制棘状图的函数fig, ax = plt.subplots()for n, value in enumerate(b.index.levels[0]):c = b[value].sort_index()c = c/c.sum()globals()['width%s'%(n+1)] = b[value].sum()/b.sum() # 计算样本量占比 width1:男 width2:女globals()['x%s'%(n+1)] = 0 if n==0 else globals()['x%s'%n]+globals()['width%s'%(n)]/2+0.02+globals()['width%s'%(n+1)]/2 # 两个柱状图保留0.1的间隙plt.bar(globals()['x%s'%(n+1)], c.cumsum()[::-1], color=colors, width=globals()['width%s'%(n+1)])plt.ylim(0,1)plt.xlim(0-width1/2, globals()['x%s'%(n+1)]+globals()['width%s'%(n+1)]/2) # xn+widthn/2plt.xticks([globals()['x%s'%(i)] for i in range(1, n+2)], b.index.levels[0])# 添加图例labels = b.index.levels[1] if labels==None else labels[plt.bar(0,0,color=colors[n],label=lab) for n,lab in enumerate(labels)]num1 = 1.01; num2 = 0.5; num3 = 3; num4 = 0plt.legend(bbox_to_anchor=(num1, num2), loc=num3, borderaxespad=num4)# 去掉边框for loc in ['top', 'left', 'bottom', 'right']:ax.spines[loc].set_visible(False)
# 生成数据
by = 20; bn = 80
gy = 2; gn = 18
a = pd.DataFrame(columns=['性别','是否出险'])
a = a.append([dict(性别='男',是否出险=1)]*by, ignore_index=True)
a = a.append([dict(性别='男',是否出险=0)]*bn, ignore_index=True)
a = a.append([dict(性别='女',是否出险=1)]*gy, ignore_index=True)
a = a.append([dict(性别='女',是否出险=0)]*gn, ignore_index=True)
a = a.append([dict(性别='未知',是否出险=0)]*20, ignore_index=True)b = a.groupby('性别').是否出险.value_counts()
b
jizhuangtu(b)
修改图例
jizhuangtu(b, labels=['a','b'])
注:记得将索引补全
b
>>> 性别 是否出险 a女 0 18女 1 2未知 0 20男 0 80男 1 20
想要补全 (未知,1)
full_index = pd.MultiIndex.from_product([['男','女','未知'],[0,1]])
b = b.reindex(full_index)
b
>>>男 0 80.01 20.0女 0 18.01 2.0未知 0 20.01 NaN
画累积/叠加柱状图 https://zhuanlan.zhihu.com/p/71840687
Survived_m = train.Survived[train.Sex =='male'].value_counts()
Survived_f = train.Survived[train.Sex =='female'].value_counts()df = pd.DataFrame({u'男性':Survived_m,u'女性':Survived_f})
df.plot(kind='bar',stacked =True)
plt.title(u'按性别看获救情况')
plt.xlabel(u'性别')
plt.ylabel(u'人数')
优化上述代码(一行解决)
trainData.groupby('p1_gender').y1_is_purchase.value_counts().unstack().plot(kind='bar', stacked=True)
python matplotlib 画棘状图和叠加柱状图相关推荐
- python画饼图程序_python使用matplotlib画饼状图
本文实例为大家分享了python使用matplotlib画饼状图的具体代码,供大家参考,具体内容如下 代码与详细注释 from matplotlib import pyplot as plt #调节图 ...
- python做房源饼状图_python使用matplotlib画饼状图
%matplotlib inlineimport matplotlib.pyplot as plt# 121 > 1行2列第1个fig1 = plt.subplot(121)plt.pie([1 ...
- python画饼图存在的问题_python_使用matplotlib画饼状图(pie)
from matplotlib import pyplot as plt #调节图形大小,宽,高 plt.figure(figsize=(6,9)) #定义饼状图的标签,标签是列表 labels = ...
- 【数据处理】python matplotlib 画箱线图;箱线图介绍;如何画箱线图
一.箱线图介绍 假设一组数据有n个数,将它们从小到大排列,分为四等分.位于第25%(n+1)位置的数字是第一四分位数Q1.位于第50%(n+1)位置的数字是第二四分位数Q2,也是中位数.位于第75%( ...
- python matplotlib画多个图_python matplotlib模块 如何画两张图出来
展开全部 python matplotlib模块 如何画两张图出2113来的方法:5261 代码如下所示: import numpy as np import matplotlib.pyplot as ...
- Python+Matplotlib绘制饼状图模拟南丁格尔玫瑰图
开学第一课:一定不要这样问老师Python问题 董付国老师Python系列教材推荐与选用参考 ============= 版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微 ...
- python的matplotlib画饼状图
函数: matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, ...
- python matplotlib画三维折线图
from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as npX=np.array ...
- python matplotlib 画DW检验图自相关图
x = np.arange(94, 105,0.1) y = stats.norm.pdf(x,100,7) #创建画布 fig = plt.figure() #使用axisartist.Subplo ...
最新文章
- nginx内置变量 大全
- 重磅!公开基于“内心对话”的EEG脑机接口数据集,助力语音意念控制研究
- Markdown的一些常用的语法
- 【Leetcode】【Medium】Rotate Image
- css 控制溢出文本显示省略号效果
- 《APUE》第6章笔记
- MAC系统下解决Teamviewers检测出商业限时问题
- Javascript 判断 object 的特定类
- java jdk 加密_jdk实现常见的加密算法
- “梅丽莎”病毒背后的神秘黑客
- 路由器温度测试软件,[折腾] 夏天别热晕了!自制光猫/路由器散热支架(更新温度测试)...
- 如何修改PDF文件的标题
- MySQL约束和表的复杂查询操作
- TensorFlow的常量、变量、常用函数(一)
- java后端判断图片尺寸(GB,MB,KB形式),图片色彩(黑白照或彩色照片),图片构图(横图竖图方图)
- Java怎样存钱利息最大_C_怎样存钱利最大
- flume系列之:处理flume 678M损毁文件
- MAC版Proxyee Down百度网盘高速下载器教程
- 《企业级ios应用开发实战》一2.4 搭建iOS开发环境
- 分布式 随笔 0-分布式服务架构
热门文章
- iOS设置自定义UA [NSUserDefaults standardUserDefaults] registerDefaults:@{ @UserAgent:
- mysql怎么禁止输出文件_MySQL禁止导出文件时写WebShell的方法 | kTWO-个人博客
- 讲解人工智能中的知识图谱、图灵测试以及深度学习、机器学习
- delete Working Copies in Xcode Source Control
- java jxl_Java操作Jxl实现数据交互。三部曲——《第三篇》
- 云原生负载均衡器之 OpenELB 中文使用指南
- 迈瑞监护仪对接(iMEC、PM、D系列等)
- 2023中南民族大学计算机考研信息汇总
- 各大电商平台API调用、淘宝API。1688API宝贝、商品数据详情采集
- linux:计划任务:单一例行性和循环例行性周期任务