Python数据可视化实战:Matplotlib绘制柱状图、折线图、饼图及散点图等常用图表
本文详细介绍如何使用Python的Matplotlib库绘制多种常用数据图表。内容涵盖柱状图(含水平排列)、折线图、饼图(详解pie函数参数)、散点图、箱线图、雷达图及气泡图的实现代码与效果。通过具体案例如水果销量分析,帮助数据分析师掌握图表制作技能,直观展示数据分布与趋势。
前言
数据分析的核心在于将数据转化为直观的图表,以辅助决策。因此,熟练掌握饼图、柱状图、线图等常见图表的制作是数据分析师必备的技能。在Python生态中,Matplotlib和Pyechart是两个备受推崇的图表制作框架。本文将重点讲解如何利用Matplotlib制作各类数据图表。
Matplotlib是Python中最流行的2D数据绘图库,支持跨平台使用,能够绘制散点图、柱状图、饼图等多种图形。
1、柱状图
柱状图是一种通过长方形或长方体的高度来展示数据的统计报告图,由一系列高度不等的纵向条纹表示数据分布情况。它主要用于比较两个或多个价值(如不同时间或不同条件下的数据),通常适用于变量较少的小型数据集分析。柱状图不仅能直观比较数据量的大小,还能观察事件的变化趋势,且支持横向排列或多维表达。
实现代码:
# 导入绘图模块
import matplotlib.pyplot as plt
# 构建数据
sales = [7125,12753,13143,8635]
# 中文乱码的处理,rcParams也可以用于设置图的分辨率,大小等信息
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘图,第一个参数是x轴的数据,第二个参数是y轴的数据,第三个参数是柱子的大小,默认值是1(值在0到1之间),color是柱子的颜色,alpha是柱子的透明度
plt.bar(range(4), sales, 0.4,color='r', alpha = 0.8)
# 添加轴标签
plt.ylabel('销量')
# 添加标题
plt.title('水果2018年度销量')
# 添加刻度标签
plt.xticks(range(4),['苹果','香蕉','梨','猕猴桃'])
# 设置Y轴的刻度范围
plt.ylim([5000,15000])
# 为每个条形图添加数值标签
for x,y in enumerate(sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 显示图形
plt.show()
效果图:

只需将绘制柱状图的函数bar()替换为barh(),即可将垂直方向的长方形或长方体转换为水平方向。
实现代码:
# 导入绘图模块
import matplotlib.pyplot as plt
# 构建数据
sales = [7125,12753,13143,8635]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['苹果','香蕉','梨','猕猴桃']
# 绘图
plt.barh(range(4), sales, 0.4,color='r', alpha = 0.8)
# 添加轴标签
plt.ylabel('销量')
# 添加标题
plt.title('水果2018年度销量')
# 添加刻度标签
plt.yticks(range(4),['苹果','香蕉','梨','猕猴桃'])
# 设置Y轴的刻度范围
plt.xlim([5000,15000])
# 为每个条形图添加数值标签
for x,y in enumerate(sales):
plt.text(y+0.2,x,'%s' %y,va='center')
# 显示图形
plt.show()
效果图:

除了将bar()改为barh()外,还需进行其他几处修改:在添加每个条形图的数值标签时,将水平对齐方式ha='center'改为垂直对齐方式va='center';同时,将添加x轴标签的方法从xlabel改为ylabel。
柱状图和折线图混合使用
柱状图可与折线图结合使用,以展示数据的变化趋势。以下示例中,柱状图表示水果的年度销量,折线图则表示水果在1月份的销量。
代码:
# 导入绘图模块
import matplotlib.pyplot as plt
jan_sales = [3010,4029,5021,3056]
# 构建数据
sales = [7125,12753,13143,8635]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['苹果','香蕉','梨','猕猴桃']
plt.plot(x,jan_sales,'r')# 折线 1 x 2 y 3 color
plt.plot(x,jan_sales,'g',lw=5)# 4 line w
# 绘图
plt.bar(range(4), sales, 0.4,color='b', alpha = 0.8)
# 添加轴标签
plt.ylabel('销量')
# 添加标题
plt.title('水果2018年度销量')
# 添加刻度标签
plt.xticks(range(4),['苹果','香蕉','梨','猕猴桃'])
# 设置Y轴的刻度范围
plt.ylim([2000,15000])
# 为每个条形图添加数值标签
for x,y in enumerate(sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 显示图形
plt.show()
效果图:

2、折线图
折线图主要用于展示数据的变化趋势,通过直线连接不同的数据点。
# 导入绘图模块
import matplotlib.pyplot as plt
#构建数据
jan_sales = [3010,4029,5021,3056]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['苹果','香蕉','梨','猕猴桃']
#第一个参数是x轴,第二参数时y轴数据,第三个参数是线的颜色,第二个参数是线条的粗细
plt.plot(x,jan_sales,'r',lw=5)# 4 line w
# 添加标题
plt.title('水果2018年度1月份销量图')
plt.ylim([2000,15000])
# 为每个点添加数值标签
for x,y in enumerate(jan_sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 显示图形
plt.show()
效果图:

折线图通过调用plot()方法绘制。
3、饼图
饼图主要用于展示数据的占比情况,使人能直观地看出各部分的比例大小。饼图使用pie()函数绘制。
import matplotlib.pyplot as plt
# 设置绘图的主题风格(不妨使用R中的ggplot分隔)
plt.style.use('ggplot')
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['苹果','香蕉','梨','猕猴桃','桔子']
explode = [0,0.1,0,0,0] # 用于突出显示大专学历人群
colors=['#FEB748','#EDD25D','#FE4F54','#51B4FF','#dd5555'] # 自定义颜色
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')
# 控制x轴和y轴的范围
plt.xlim(0,4)
plt.ylim(0,4)
# 绘制饼图
plt.pie(x = edu,# 绘图数据
explode=explode, # 突出显示香蕉人群
labels=labels, # 添加水果销量水平标签
colors=colors, # 设置饼图的自定义填充色
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
pctdistance=0.8,# 设置百分比标签与圆心的距离
labeldistance = 1.15, # 设置销量水平标签与圆心的距离
startangle = 180, # 设置饼图的初始角度
radius = 1.5, # 设置饼图的半径
counterclock = False, # 是否逆时针,这里设置为顺时针方向
wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值
center = (1.8,1.8), # 设置饼图的原点
frame = 1)# 是否显示饼图的图框,这里设置显示
# 删除x轴和y轴的刻度
plt.xticks(())
plt.yticks(())
# 添加图标题
plt.title('2018年水果销量分析')
# 显示图形
plt.show()
效果图:

简要介绍pie函数的主要参数:
- x: 指定绘图的数据
- explode: 指定饼图中某些部分的突出显示,即呈现爆炸式效果
- labels: 为饼图添加标签说明,类似于图例说明
- colors: 指定饼图的填充色
- autopct: 设置百分比格式,如'%.1f%%'表示保留一位小数
- shadow: 是否添加饼图的阴影效果
- pctdistance: 设置百分比标签与圆心的距离
- labeldistance: 设置各扇形标签(图例)与圆心的距离
- startangle: 设置饼图的初始摆放角度,180表示水平
- radius: 设置饼图的半径大小
- counterclock: 是否让饼图按逆时针顺序呈现,值为True或False
- wedgeprops: 设置饼图内外边界的属性,如边界线的粗细、颜色等,例如wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'}
- textprops: 设置饼图中文本的属性,如字体大小、颜色等
- center: 指定饼图的中心点位置,默认为原点
- frame: 是否要显示饼图背后的图框,如果设置为True,需要同时控制图框x轴、y轴的范围和饼图的中心位置
4、散点图
散点图的主要作用是判断两个变量之间关系的强弱,或者确认是否存在关系。
散点图由scatter()方法绘制。
import numpy as np import matplotlib.pyplot as plt # 数据个数 n = 50 # 均值为0, 方差为1的随机数 x = np.random.normal(0, 1, n) y = np.random.normal(0, 1, n) # 计算颜色值 color = np.arctan2(y, x) # 绘制散点图 plt.scatter(x, y, s = 75, c = color, alpha = 0.5) # 设置坐标轴范围 plt.xlim((-1.5, 1.5)) plt.ylim((-1.5, 1.5)) # 不显示坐标轴的值 plt.xticks(([-1,0,1,2,3,4])) plt.yticks(([-1,0,1,2,3,4])) plt.show()
效果图:

5、箱线图
箱线图通常用于展示数据的大小、占比、趋势等信息,包含均值、分位数、极值等统计量。因此,该图信息量大,不仅能分析不同类别数据的平均水平差异(需在箱线图中加入均值点),还能揭示数据间的离散程度、异常值及分布差异等。
使用boxplot()方法绘制。
import numpy as np import matplotlib.pyplot as plt import pandas as pd np.random.seed(2) #设置随机种子 df = pd.DataFrame(np.random.rand(5,4), columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中 df.boxplot() #也可用plot.box() plt.show()
效果图:

6、雷达图
雷达图可用于显示一个周期数值的变化,也可用于展示多个对象或维度之间的关系。
import numpy as np
import matplotlib.pyplot as plt
#标签
labels = np.array(['语文','数学','英语','生物','物理','化学'])
#数据个数
dataLenth = 6
#数据
data = np.array([7,4,3,6,4,8])
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
data = np.concatenate((data, [data[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)# polar参数!!
ax.plot(angles, data, 'bo-', linewidth=2)# 画线
ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei")
ax.set_rlim(0,10)
ax.grid(True)
plt.show()
效果图:

7、气泡图
气泡图用于判断3个变量之间是否存在某种关系。它与散点图类似,区别在于气泡图以气泡大小作为新的维度。
import pandas as pd
import matplotlib.pyplot as plt
import pandas as pd
d = {"时间":pd.Series([2006,2007,2008,2009,2010]),
"数量":pd.Series([10,200,120,150,300]),
"大小":pd.Series([50,130,40,50,160]),
"分类":pd.Series([1,2,0,1,2]),
"判断":pd.Series([True,True,True,True,True])}
df=pd.DataFrame(d)
#先定义气泡大小,rank 函数将大小列进行大小分配,越大的值分配结果也越高
#n 为倍数,用来调节气泡的大小,且看后头
size=df['大小'].rank()
n=20
#定义一个字典,将颜色跟对应的分类进行绑定
color={0:'red',1:'blue',2:'orange'}
#增加color的参数,用列表解析式将data分类中的每个数据的数字映射到前面color的颜色中
plt.scatter(df['数量'],df['大小'],color=[color[i] for i in df['分类']],s=size*n,alpha=0.6)
plt.show()
效果图:

气泡图同样使用scatter方法绘制,与散点图相同。主要区别在于点的大小:散点图的点大小一致,而气泡图的点大小不同。
以上介绍了柱状图、散点图、气泡图、折线图的实现方式,希望能为读者提供帮助。
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或工作具有一定的参考学习价值。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













