Python用 matplotlib 绘制柱状图
作者:盆友圈的小可爱 发布时间:2023-01-22 01:20:50
目录
1. 柱状图概述
1.1什么是柱状图
1.2柱状图使用场景
1.3柱状图绘制步骤
1.3案例展示
2. 柱状图属性
2.1柱状体颜色填充
2.2状描边设置
2.3状体边框宽度
2.4刻度标签
3. 堆叠柱状图
4. 并列柱状图
5. 水平柱状图
6. 添加折线柱状图
7. 正负柱状图
复习回顾:
Python 为数据展示提供了大量优秀的功能包,其中 matplotlib 模块可以方便绘制制作折线图、柱状图、散点图等高质量的数据包。
关于 matplotlib 模块,我们前期已经对matplotlib进行基本框架、以及常用方法的学习
?matplotlib 模块基础知识:对matplotlib模块进行初步认识,对常用的方法进行学习
matplotlib 模块底层原理:matplotlib 模块包含脚本层、美工层及后端层三层细节了解
matplotlib 模块折线图绘制:总结折线图相关属性和方法
在 matplotlib 模块提供的图表中,除了折线图使用最多外,柱状图也是我们日常数据分析的图表。
接下来我们开始学习绘制柱状图相关属性和方法
1. 柱状图概述
1.1什么是柱状图
柱状图又称为条形图,是一种以长方形的长度为变量数据进行统计的图表
柱状图用来比较两个或以上类型
柱状图只有一个以长方形的长度为变量
柱状图可以横向排列或者多维方式展示
1.2柱状图使用场景
柱状图适用在较小数据集的分析
适用二维数据集,只比较一个维度数据差异项
直观展示各个体之间数据的差异
表现离散型的时间序列
1.3柱状图绘制步骤
导入matplotlib.pyplot模块
准备数据,可以使用numpy/pandas整理数据
调用pyplot.bar()绘制柱状图
1.3案例展示
本次,我们分析过去5年内的产品年销量展示
案例所用到的数据如下:
import random
x_data = ["20{}年".format(i) for i in range(16,21)]
y_data = [random.randint(100,300) for i in range(6)]
绘制柱状图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=['SimHei']
plt.rcParams["axes.unicode_minus"]=False
for i in range(len(x_data)):
plt.bar(x_data[i],y_data[i])
plt.title("销量分析")
plt.xlabel("年份")
plt.ylabel("销量")
plt.show()
2. 柱状图属性
2.1柱状体颜色填充
facecolor(fc)关键字
color 关键字
颜色简称:
属性值 | 说明 | 属性值 | 说明 |
---|---|---|---|
"b"/"bule" | 蓝色 | "m"/"magenta" | 品红 |
"g" /"green" | 绿色 | "y"/"yellow" | 黄色 |
"r"/"red" | 红色 | "k"/"black" | 黑色 |
"c"/"cyan" | 青色 | "w"/"white" |
rgb:
格式形式:(r,g,b)
取值范围:0~1
2.2状描边设置
柱状体边框颜色
edgecolor 或者 ec
柱状体边框样式
linestyle 或者 ls
线条样式:
属性值 | 说明 |
---|---|
"-" 、"solid" | 默认实线显示 |
"--"、"dashed" | 虚线 |
"-." "dashdot" | 点划线 |
":"、"dotted" | 虚线 |
"None" """" | 空 |
2.3状体边框宽度
linewidth 或者 lw
柱状图填充样式
hatch: 设置填充样式
属性取值:{'/', '', '|', '-', '+', 'x', 'o', 'O', '.', '*'} |
2.4刻度标签
tickle label:默认使用数字标签
我们对 第一节柱状图添加边框样式为"--",添加指定rgb颜色,填充圆圈
for i in range(len(x_data)):
plt.bar(x_data[i],y_data[i],color=(0.2*i,0.2*i,0.2*i),linestyle="--",hatch="o")
3. 堆叠柱状图
在柱状图中,我们会在同时对比两组数据在同一类中的表现形式,因此需要绘制堆叠柱状图
bottom : 条形底座的y坐标,默认值为0
在第一节案例中,添加一组y轴数据所有数据如下:
x_data = ["20{}年".format(i) for i in range(16,21)]
y_data = list(random.randint(100,300) for i in range(5))
y2_data = list(random.randint(100,300) for i in range(5))
再添加一次pyplot.bar方法,添加bottom属性
plt.bar(x_data,y_data,lw=0.5,fc="r",label="Phone")
plt.bar(x_data,y2_data,lw=0.5,fc="b",label="Android",bottom=y_data)
4. 并列柱状图
在绘制并列的柱状图中,要控制好每个柱状体的位置和大小可以使用width属性
width: 设置每组柱状体的宽度
x轴:x轴的宽度每组直接也要设置好
例如继续改造上面案例,我们为bar1和bar2添加了width属性后,单独设置x轴并排的宽度为0.3
x_width = range(0,len(x_data))
x2_width = [i+0.3 for i in x_width]
plt.bar(x_width,y_data,lw=0.5,fc="r",width=0.3,label="Phone")
plt.bar(x2_width,y2_data,lw=0.5,fc="b",width=0.3,label="Android")
plt.xticks(range(0,5),x_data)
5. 水平柱状图
柱状图中,有时候需要让柱状图水平放置,比较差异,我们这时候需要使用到barh
方法
pyplot.barh(y,width):绘制水平柱状图
结合上述案例,改用barh方法
x_data = ["20{}年".format(i) for i in range(16,21)]
y_data = list(random.randint(100,300) for i in range(5))
y2_data = list(random.randint(100,300) for i in range(5))
x_width = range(0,len(x_data))
x2_width = [i+0.3 for i in x_width]
plt.barh(x_width,y_data,lw=0.5,fc="r",height=0.3,label="Phone")
plt.barh(x2_width,y2_data,lw=0.5,fc="b",height=0.3,label="Android")
plt.yticks(range(0,5),x_data)
plt.legend()
plt.title("销量分析")
plt.ylabel("年份")
plt.xlabel("销量")
plt.show()
6. 添加折线柱状图
我们在查看柱状图时,有时候会需要辅助折线来查看
使用
pyplot.plot()
方法汇总折线图同时使用
pyplot.text()
显示坐标值当堆叠图时,需要计算好折线相对位置
plt.plot(x_data,y_data,color="pink",linestyle="--")
plt.plot(x_data, y2_data+200, color="skyblue", linestyle="-.")
# 柱状图
plt.bar(x_data,y_data,lw=0.5,fc="r",width=0.3,label="Phone",alpha=0.5)
plt.bar(x_data,y2_data, lw=0.5, fc="b", width=0.3, label="Android",alpha=0.5,bottom=y_data)
for i,j in zip(x_data,y_data):
plt.text(i,j+0.05,"%d"%j,ha="center",va="bottom")
for i2,j2 in zip(x_data,y2_data):
plt.text(i2,j2+180,"%d"%j2,ha="center",va="bottom")
7. 正负柱状图
我们需要使用Axes对象来设置坐标轴的位置
首先使用
pyplot.gca()
方法创建axes对象然后使用
matplotlib.spines
模块调用set_position设置坐标轴位置set_position 设置轴位置点
spines[]选项有"
left"|"bottom"|"width"|"height"
set_position 值格式为(位置类型,数量);位置类型;"outward"|"axes"|"data"|;数量:中心->("轴",0.5),零->("数据",0.0)
y_data = np.random.randint(100, 300,5)
y2_data = np.random.randint(100, 300,5)
ax = plt.gca()
ax.spines["bottom"].set_position(('data', 0))
plt.bar(x_data,+y_data,lw=0.5,fc="r",width=0.3,label="Phone")
plt.bar(x_data,-y2_data, lw=0.5, fc="b", width=0.3, label="Android")
for i,j in zip(x_data,y_data):
plt.text(i,j,"%d"%j,ha="center",va="top")
for i2,j2 in zip(x_data,y2_data):
plt.text(i2,-j2,"%d"%j2,ha="center",va="bottom")
总结:
本文我们atplotlib模块中详细学习绘制各种柱状图标相关属性和方法,在遇到需要直观展示离散数据点的差异时,我们可以使用bar()或者barh()绘制美观的图表。
来源:https://juejin.cn/post/7030008027373633573
猜你喜欢
- 前言:Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数,itertools提供的几个“无限
- 1.什么是并发编程并发编程是实现多任务协同处理,改善系统性能的方式。Python中实现并发编程主要依靠进程(Process):进程是计算机中
- 今天用要django传值给模板, 然后需要用js处理一下.特此记录.用json.dumps()方法将值传给模板.import json re
- python解释器默认编码(python2与python3的区别一)python2 解释器默认编码:asciipython3 解释器默认编码
- 从url中找到域名,首先想到的是用正则,然后寻找相应的类库。用正则解析有很多不完备的地方,url中有域名,域名后缀一直在不断增加等。通过go
- 前言最近因为工作的需要,在写一些python脚本,总是使用print来打印信息感觉很low,所以抽空研究了一下python的logging库
- 详解python里使用正则表达式的全匹配功能python中很多匹配,比如搜索任意位置的search()函数,搜索边界的match()函数,现
- 本文从算法入手同时通过实例来讲解如何在SQL Server数据库中实现最优最简的整个过程。算法是计算机科学中一个重要的研究方向,是解决复杂问
- 这篇论坛文章详细介绍了完全卸载MySQL数据库5.0的具体方法,更多内容请参考下文:数据库突然出了问题,没办法只能重装,因为事先并不知道My
- Python的运算符和其他语言类似(我们暂时只了解这些运算符的基本用法,方便我们展开后面的内容,高级应用暂时不介绍)数学运算>>
- 本文实例讲述了Python单向链表和双向链表原理与用法。分享给大家供大家参考,具体如下:链表是一种数据结构,链表在循环遍历的时候效率不高,但
- MySQL多个left join on关联条件顺序注意:下面的案例特别重要!请重视!SQL有点长,但确实是干货!结论如果存在多个left j
- python简单游戏-反弹球,供大家参考,具体内容如下tkinter实现,直接贴上代码from tkinter import*import
- 对于二维数组,img_mask[[ 0 0 0 ..., 7 7 7] [ 0 0 0 ..., 7 7 7] [ 0 0 0 ..., 7
- 错误重现:首先在控制面板里卸载了sqlserver软件,一切正常,然后重启(一定要重启,否则没法重装),执行sqlserver的安装程序,一
- 本文主要研究的是selenium python浏览器多窗口处理的相关内容,分享了操作实例代码,具体如下:#!/usr/bin/python#
- 本文实例讲述了MySQL 表数据的导入导出操作。分享给大家供大家参考,具体如下:数据导出1. 使用 SELECT ..
- 是不是有这么一个场景,对外提供一堆数据或者是要返回给用户一个结果。但是不想把内部的一些数据和逻辑暴露给对方。。。简单点来说,就是想以服务的方
- 1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,as
- decimal 模块:decimal意思为十进制,这个模块提供了十进制浮点运算支持1.可以传递给Decimal整型或者字符串参数,但不能是浮