Matplotlib绘制条形图的方法你知道吗


Posted in Python onMarch 21, 2022
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager

一、一般条形图

一般条形图使用 pyplot.bar()函数绘制,其形式及参数如下:

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
主要参数解释:
# x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点。
# height:一个数组或者列表,代表需要绘制的条形图y轴的坐标点。
# width:每一个条形图的宽度,默认是0.8的宽度。
# bottom:y轴的基线,默认是0,也就是距离底部为0.
# align:对齐方式,{'center','edge'},默认是center,居中对齐;edge为靠边对齐,具体靠右边还是靠左边,看width的正负。
# color:条形图的颜色。
# edgecolor : 条形图边框的颜色。
# linewidth  : 条形图边框的宽度。如果为 0,则不绘制边框

示例:

某天电影票房数据:

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}

直接通过获取字典的键值作为x,y轴数据

#票房单位亿元
movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
# 中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 13
# 设置图大小
plt.figure(figsize=(15,8))

x = list(movies.keys()) # 获取x轴数据(字典的键)
y = list(movies.values()) # 获取y轴数据(字典的值)

plt.bar(x,y,width=0.5,bottom=0,align='edge',color='g',edgecolor ='r',linewidth=2)

# 绘制标题
plt.title("电影票房数据",size=26)

# 设置轴标签
plt.xlabel("电影名",size=28)
plt.ylabel("票房/亿",size=28)

plt.show()

Matplotlib绘制条形图的方法你知道吗

也可以利用字典创建DataFrame索引,通过data参数传入

#票房单位亿元
movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
movies_df = pd.DataFrame(data={"name":list(movies.keys()),"tickes":list(movies.values())}) #通过字典创建DataFrame索引
font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF',size=12)  # 使用font_manager模块设置中文

# 设置图的大小,传入x,y
plt.figure(figsize=(14,5))

# 使用plt.bar()绘制条形图
plt.bar("name","tickes",data=movies_df,width=0.5,bottom=0,align='edge',color='g',edgecolor ='r',linewidth=2)

#设置X轴刻度,设置字体,也可以设置字体大小size
plt.xticks(fontproperties=font)

# 设置标题
plt.title("电影票房数据",size=30)
#设置X,Y轴名字
plt.ylabel('票房',fontproperties=font,size=25)
plt.xlabel('影片名字',fontproperties=font,size=25)

#设置Y刻度
plt.yticks(range(0,50,5),["%d"%x for x in range(0,50,5)],fontproperties=font1,size=20)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

二、横向条形图

横向条形图需要使用barh()这个跟bar非常的类似,只不过把方向进行旋转。参数也和pyplot.bar()类似

matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
# 主要参数解释:
# y:数组或列表,代表需要绘制的条形图在y轴上的坐标点。
# width:数组或列表,代表需要绘制的条形图在x轴上的值(也就是长度)。
# height:条形图的高度(宽度),默认是0.8。
# left:条形图的基线,也就是距离y轴的距离。默认为0

示例:

plt.barh()

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
font2 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')
x1 = list(movies.keys())
y1 = list(movies.values())

# 设置图的大小
plt.figure(figsize=(10,5))

# 使用plt.barh()
plt.barh(x1,y1,height=0.7,left=0,color='c',edgecolor='r')

#设置Y轴刻度,设置字体,也可以设置字体大小size
plt.yticks(fontproperties=font2,size=20)

plt.xlabel("票房/亿",size=20)

# 设置标题
plt.title("电影票房数据",size=30)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

Axes.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

另外,还可通过返回的axes对象绘制图形

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}

font2 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')
mdf = pd.DataFrame(data={"name":list(movies.keys()),"tickes":list(movies.values())})

fig,axes = plt.subplots()  

# 通过返回的axes对象绘制图形
axes.barh("name","tickes",data = mdf,height=0.6,left=0,color='c',edgecolor='r')

#设置Y轴刻度,设置字体,也可以设置字体大小size
plt.yticks(fontproperties=font2,size=20)

plt.xlabel("票房/亿",size=24)

# 设置标题
plt.title("电影票房数据",size=27)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

三、分组条形图的绘制

五天的电影票房数据(假设日期为1.1-1.5):并转换为DataFrame索引

movies = {
    "流浪地球":[2.01,4.59,7.99,11.83,16],
    "飞驰人生":[3.19,5.08,6.73,8.10,9.35],
    "疯狂的外星人":[4.07,6.92,9.30,11.29,13.03],
    "新喜剧之王":[2.72,3.79,4.45,4.83,5.11],
    "廉政风云":[0.56,0.74,0.83,0.88,0.92],
    "神探蒲松龄":[0.66,0.95,1.10,1.17,1.23],
    "小猪佩奇过大年":[0.58,0.81,0.94,1.01,1.07],
    "熊出没·原始时代":[1.13,1.96,2.73,3.42,4.05]
}
mdf = pd.DataFrame(movies)  
mdf

Matplotlib绘制条形图的方法你知道吗

绘制分组条形图思路:先选出每天所有电影的票房数据,可使用DataFrame.iloc[]方法获取,例如

# 获取第一天票房数据
mdf.iloc[0]
流浪地球        2.01
飞驰人生        3.19
疯狂的外星人      4.07
新喜剧之王       2.72
廉政风云        0.56
神探蒲松龄       0.66
小猪佩奇过大年     0.58
熊出没·原始时代    1.13
Name: 0, dtype: float64

然后按天进行绘制,这里需要确定一个中心点作为中间日期的条形图位置(这里为第三天),有多少部电影就需要多少个中心点,可使用np.arange(len(movies))获取x轴刻度作为中心点。最后根据日期按条形图的宽度调整条形图位置即可。

plt.figure(figsize=(15,5))
# 设置X轴刻度为一个数组(有广播功能)
xticks = np.arange(len(movies)) 

#设置字体
font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')

# 设置条形图宽度
bar_width = 0.15

#设置第一天所有影片条形图的位置
plt.bar(xticks-2*bar_width,mdf.iloc[0],width=bar_width,color='pink') # iloc[]取DataFrame的一行
#设置第二天所有影片条形图的位置 
plt.bar(xticks-bar_width,mdf.iloc[1],width=bar_width)
#设置第三天所有影片条形图的位置,默认在[0 1 2 3 4 5 6 7]center处
plt.bar(xticks,mdf.iloc[2],width=bar_width)
#设置第四天所有影片条形图的位置
plt.bar(xticks+bar_width,mdf.iloc[3],width=bar_width)
#设置第五天所有影片条形图的位置
plt.bar(xticks+2*bar_width,mdf.iloc[4],width=bar_width)

# 设置X轴信息
plt.xticks(xticks,mdf.columns,fontproperties=font,size=15)
#设置Y刻度
plt.yticks(range(0,20,2),["%d"%x for x in range(0,20,2)],fontproperties=font,size=16)

#设置X,Y轴名字
plt.ylabel('票房/亿',fontproperties=font,size=30)
plt.xlabel('影片名字',fontproperties=font,size=30)

# 设置标题
plt.title("五日票房数据",fontproperties=font,size=30)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

使用循环绘制每日数据

plt.figure(figsize=(16,5))
# 设置X轴刻度为一个数组(有广播功能)
#xticks1 = np.arange(len(movies)) # 这样设置每部电影X轴的距离是1,如果5个条形图宽度之后大于1会和其他电影重叠,可以设置步长
xticks1 = np.arange(0,7*len(movies),7) # 改变步长,要在设置X轴信息处改变xticks(步长*ticks labels)的第一个参数,否则对应不上

#设置字体
font4 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')

# 设置条形图宽度
bar_width1 = 1.05

#使用循环画出前五天的条形图
for index in mdf.index:
   # plt.bar(xticks1+(-2+index)*bar_width1,mdf.iloc[index],width=bar_width1,label='第%d天票房'%(index+1))
    xs = xticks1+(-2+index)*bar_width1 # 在X轴的位置
    day_tickets = mdf.iloc[index]
    plt.bar(xs,day_tickets,width=bar_width*7,label="第%d天票房"%(index+1))
    #设置注释文本
    # zip(day_tickets,xs)打包为元素为元组的列表,元素个数与最短的列表一致
    for ticket,x in zip(day_tickets,xs):   # ticket是day_tickets列表的值,x是xs的值
        plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.2,ticket+0.1))


# 设置X轴信息
plt.xticks(7*xticks,mdf.columns,fontproperties=font4,size=15)

#设置X,Y轴名字
plt.ylabel('票房/亿',fontproperties=font4,size=25)
plt.xlabel('影片名字',fontproperties=font4,size=25)

# 设置标题
plt.title("五日票房数据",fontproperties=font4,size=30)

# 设置图例
font4.set_size(15) # 图例无size属性,可以在字体设置font4中改大小(或者font.set_size():只改图例
plt.legend(prop=font4)  # 根据bar()函数的中的label标签进行设置,不可缺少

# 设置网格
plt.grid()

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

四、堆叠条形图绘制

堆叠条形图就是在已有数据基础位置上进行绘制图形,使用bottom参数,以已有数据作为新数据的基地进行新数据的绘制,可以达到调整条形图的位置的目的。

示例:

# 男女不同组别的等分情况
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
groupNames = ('G1','G2','G3','G4','G5')

xs = np.arange(len(menMeans))  # 有多少个组

font5 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF',size=16)

plt.figure(figsize=(15,7))

# 绘制男性得分
plt.bar(xs,menMeans,label='男性得分',width=0.4)

# 绘制女性得分,以男性得分的最大值为基底
plt.bar(xs,womenMeans,bottom=menMeans,label='女性得分',width=0.4)

#设置图例
plt.legend(prop=font5)  # 根据bar()函数的中的label标签进行设置

# 设置X轴刻度名称
plt.xticks(xs,groupNames)

# 设置标签
plt.xlabel("组别",fontproperties=font5,size=23)
plt.ylabel("得分",fontproperties=font5,size=23)

# 设置标题
plt.title("男女不同组别得分",fontproperties=font5,size=28)

# 只保留图形
plt.show()

Matplotlib绘制条形图的方法你知道吗

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容! 

Python 相关文章推荐
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
详解python里使用正则表达式的全匹配功能
Oct 19 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
python多线程案例之多任务copy文件完整实例
Oct 29 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
字典算法实现及操作 --python(实用)
Mar 31 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
分享几种python 变量合并方法
Mar 20 #Python
You might like
目录,文件操作详谈―PHP
2006/11/25 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
jQuery Ajax之load()方法
2009/10/12 Javascript
js格式化时间小结
2014/11/03 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
对python 命令的-u参数详解
2018/12/03 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
什么是跨站脚本攻击
2014/12/11 面试题
大学在校生求职信范文
2013/11/21 职场文书
特色冷饮店创业计划书
2014/01/28 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
三人合伙协议书范本
2014/10/29 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
宾馆客房管理制度
2015/08/06 职场文书