如何使用Python Matplotlib绘制条形图
作者:芒果去核 发布时间:2023-09-21 04:41:46
标签:matplotlib,绘制,条形图
前言
matplotlib是一个非常强大的Python第三方绘图包,可以绘制非常多非常漂亮的图形。
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,则不绘制边框
pyplot.bar()完整参数戳这里
示例:
某天电影票房数据:
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()
也可以利用字典创建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()
二、横向条形图
横向条形图需要使用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
pyplot.barh()完整参数
示例:
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()
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()
三、分组条形图的绘制
五天的电影票房数据(假设日期为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
绘制分组条形图思路:先选出每天所有电影的票房数据,可使用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()
使用循环绘制每日数据
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()
四、堆叠条形图绘制
堆叠条形图就是在已有数据基础位置上进行绘制图形,使用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()
总结
来源:https://blog.csdn.net/weixin_45499440/article/details/123618033


猜你喜欢
- 以前工作中需要全新的Access数据库,可以复制数据库,也可以把新的数据库放到资源里面,用新数据库的时候释放出来,都感觉不爽,还是动态生成心
- 在python3爬虫中如何我们想要导入/导出Redis数据,就要安装使用RedisDump。RedisDump是一个用于Redis数据导入/
- 远程连接oracle只用PLSQLDeveloper客户端,不配置tnsnames.ora文件在PL/SQL中填写:1.UserName:用
- Matplotlib效果图如下主要使用matplotlib.animation.FuncAnimation,上核心代码,# 定义静态绘图函数
- Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Pyth
- 1.在线定制下载echartshttps://echarts.apache.org/zh/builder.html2.创建一个django项
- 函数是有组织的,可重复使用的代码,用于执行一个单一的,相关的动作的块。函数为应用程序和代码重用的高度提供了更好的模块。正如我们知
- 如下所示:import ( "golang.org/x/net/html")在使用此包时,会导入失败,因为这
- tomorrow是我最近在用的一个爬虫利器,该模块属于第三方的一个模块,使用起来非常的方便,只需要用其中的threads方法作为装饰器去修饰
- 本文以实例形式简述了Python实现字符串排序的方法,是Python程序设计中一个非常实用的技巧。分享给大家供大家参考之用。具体方法如下:一
- 适配器模式Adapter Pattern是什么适配器模式是一种结构型模式,它可以将一个类的接口转换成客户端所期望的接口,从而使原本不兼容的类
- 两张表,A表中的记录B表中不一定有。左连接:关注左边,右边没有就为空。右连接:关注右边,左边没有就为空。内连接:返回交集例如:student
- jQuery 1.4 源码 449 行(core.js 431 行),判断是否为函数的方法如下(思路来源于 Douglas Crockfor
- canal简介由阿里巴巴开源 github地址:https://github.com/alibaba/canalCanal是阿里巴巴开源的一
- 示例函数为了开发类型检查器,我们需要一个简单的函数对其进行实验。欧几里得算法就是一个完美的例子: def gcd(a, b):
- SQL语句中要不要加单引号?犯了一个超级超级蠢的错误,把population写成polulation而不自知,多次提醒我找不到polulat
- 最近想抢冰墩墩的手办和钥匙圈,但是同志们抢的速度太快了,无奈,还是自己写脚本吧。添加火狐浏览器插件Omnibug是一个插件,可以简化web度
- PHP htmlentities() 函数实例把一些字符转换为 HTML 实体:<?php $str = "<&
- 经过漫长的等待,近日,微软终于发布了Silverlight 2正式版的发布不仅让微软有了更多和Flash叫板的机会,同时也将RIA(Rich
- python logging 重复写日志问题用Python的logging模块记录日志时,遇到了重复记录日志的问题,第一条记录写一次,第二条