Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-1
https://developer.aliyun.com/article/1537819
6. 绘制柱状图
使用bar函数可以绘制柱状图。柱状图需要水平的x坐标值,以及每一个x坐标值对应的y坐标值,从而形成柱状的图。柱状图主要用来纵向对比和横向对比的。例如,根据年份对销售收据进行纵向对比,x坐标值就表示年份,y坐标值表示销售数据。
【示例】使用bar绘制柱状图,并设置柱的宽度
# 导入matplotlib模块 import matplotlib.pyplot as plt # 创建x,y坐标 x = [1980, 1985, 1990, 1995] y = [1000, 3000, 4000, 5000] x_label = ['1980年', '1985年', '1990年', '1995年'] # 调用bar函数绘制柱状图 plt.bar(x, y, width=3) # 通过width修改柱的宽度,数值为标准柱宽度的倍数 # 设置字体解决中文乱码问题 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 # 通过xticks修改x坐标的值 # plt.xticks(x, x) plt.xticks(x, x_label) # 设置x,y轴的名称 plt.xlabel('年份') plt.ylabel('销量') # 设置图例名称 plt.title('年份销量对比图') # 显示绘制图形 plt.show()
运行效果如下:
注意:bar函数的宽度并不是像素宽度。bar函数会根据二维坐标系的尺寸,以及x坐标值的多少,自动确定每一个柱的宽度,而width指定的宽度就是这个标准柱宽度的倍数。该参数值可以是浮点数,如0.5,表示柱的宽度是标准宽度的0.5倍。
【示例】使用bar和barh绘制柱状图
# 导入模块 import matplotlib.pyplot as plt import numpy as np # 创建x,y np.random.seed(0) x = np.arange(5) # 生成[0, 5)之间的整数 y = np.random.randint(-5, 5, 5) # 随机生成[-5, 5)之间的整数 # 将画布分为一行两列,在第一部分用bar函数画 plt.subplot(1, 2, 1) # 在0位置处添加水平方向蓝色线条 plt.axhline(0, color='blue', linewidth=3) plt.bar(x, y, color='blue') # 在第二部分用barh函数画 plt.subplot(1, 2, 2) # 在0位置处添加垂直方向红色线条 plt.axvline(0, color='red', linewidth=2) plt.barh(x, y, color='red') # 显示绘制图形 plt.show()
运行效果如下:
【示例】对部分柱状图,使用颜色区分
# 导入模块 import matplotlib.pyplot as plt import numpy as np # 创建x,y np.random.seed(0) x = np.arange(5) # 生成[0, 5)之间的整数 y = np.random.randint(-5, 5, 5) # 随机生成[-5, 5)之间的整数 v_bar = plt.bar(x, y, color='blue') # 对y大于0的合作为蓝色,小于0设置为绿色 for bar, height in zip(v_bar, y): if height < 0: bar.set(color='green') # 显示绘制图形 plt.show()
运行效果如下:
补充:zip函数将多个可迭代对象中对应位置的元素打包成一个个元组,然后返回一个新的可迭代对象(通常是一个zip对象)。
语法:
- 语法:zip(iterable, …)
- 参数:
iterable: 一个或多个可迭代对象
【示例】将两个列表按位置打包成元组的列表
names = ['Alice', 'Bob', 'Charlie'] ages = [25, 30, 35] person_info = zip(names, ages) print(list(person_info)) # 输出:[('Alice', 25), ('Bob', 30), ('Charlie', 35)]
【示例】柱状图使用实例
# 导入模块 import matplotlib.pyplot as plt import numpy as np # 准备数据如 电影名称以及电影票房数 movie_name = ['千与千寻', '玩具总动员4', '黑衣人:全球追缉'] # 连续3天的票房数 real_num1 = [7548, 4013, 1673] real_num2 = [5435, 1845, 1028] real_num3 = [4203, 3305, 1369] x = np.arange(len(movie_name)) # 绘制柱状图 # 设置宽度 width = 0.3 plt.bar(x, real_num1, alpha=0.5, width=width, label=movie_name[0]) # 利用列表推导式设置宽度使其柱状图不重叠 plt.bar([i + width for i in x], real_num2, alpha=0.5, width=width, label=movie_name[1]) plt.bar([i + 2 * width for i in x], real_num3, alpha=0.5, width=width, label=movie_name[2]) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 # 利用列表推导式设置x坐标的值, 第一天 第二天 第三天 x_label = ['第{}天'.format(i + 1) for i in x] plt.xticks([i + width for i in x], x_label) # 添加y轴名称 plt.ylabel('票房数') # 添加图例 plt.legend() # 添加标题 plt.title('电影票房数') # 显示绘制图形 plt.show()
运行效果如下:
7. 绘制饼状图
pie函数可以绘制饼状图,饼图主要是用来呈现比例的。只要传入比例数据即可。
【示例】绘制饼状图
# 导入模块 import matplotlib.pyplot as plt # 男女人数及比例 单位:万人 man = 71135 woman = 68185 # 比例 man_perc = man / (man + woman) woman_perc = woman / (man + woman) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 # 添加名称 labels = ['男', '女'] # 颜色 colors = ['biue', 'orange'] # 绘制饼状图 调用pie方法。 # explode参数用于指定饼图中各个扇形的偏移程度。 # autopct参数用于指定如何显示每个扇形的百分比值 plt.pie([man_perc, woman_perc], labels=labels, explode=(0, 0.05), autopct='%0.1f%%') # 显示绘制图形 plt.show()
运行效果如下:
8. 绘制直方图
直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义却有很大的差异。直方图是用来观察分布状态的,而柱状图是用来看每一个X坐标对应的Y的值的。也就是说,直方图关注的是分布,并不关心具体的某个值,而柱状图关心的是具体的某个值。使用hist函数绘制直方图。
【示例】使用randn函数生成1000个正太分布的随机数,使用hist函数绘制这1000个随机数的分布状态
# 导入模块 import matplotlib.pyplot as plt import numpy as np # 生成1000个标准正态分布随机数 x = np.random.randn(1000) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 # 设置标题 plt.title('标准正态分布直方图') # 绘制直方图 plt.hist(x, bins=100) # 将数据分成100个箱子 # 显示绘制的图形 plt.show()
运行效果如下:
【示例】使用normal函数生成1000个正太分布的随机数,使用hist函数绘制这100个随机数的分布状态
# 导入模块 import matplotlib.pyplot as plt import numpy as np # 调用np.rangom.normal()指定期望和方差的正态分布,(期望, 标准差, 个数) x = np.random.normal(0, 0.8, 1000) y = np.random.normal(-2, 1, 1000) z = np.random.normal(3, 2, 1000) # 参数alpha用于设置透明度, 参数bins=100表示将数据分成100个箱子 kwargs = dict(bins=100, alpha=0.5) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 # 设置图形标题 plt.title('非标准正态分布直方图') # 绘制直方图 plt.hist(x, **kwargs) plt.hist(y, **kwargs) plt.hist(z, **kwargs) # 显示绘制的图形 plt.show()
运行效果如下:
9. 绘制等高线图
【示例】使用pyplot绘制等高线图
# 导入模块 import matplotlib.pyplot as plt import numpy as np # 生成100个-10-10之间的等差数列 x = np.linspace(-10, 10, 100) y = np.linspace(-10, 10, 100) # 计算出x,y相交的点X,Y X, Y = np.meshgrid(x, y) # 计算Z Z = np.sqrt(X**2 + Y**2) # 计算括号内值的开方 # 绘制等高线图 # plt.contour(X, Y, Z) plt.contourf(X, Y, Z) # 在contour()的基础上有颜色填充 # 显示绘制的图形 plt.show()
运行效果如下:
10. 绘制三维图
matplotlib支持绘制三维线框图, 三维曲面图, 三维散点图. 需要使用axes3d提供3d坐标系.
【示例】使用pyplot包和Matplotlib绘制三维图
import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax3d = fig.add_subplot(121, projection='3d') # filled为bool类型数组,在True的元素下标位置绘制体元素 i, j, k = np.indices((3, 3, 3)) filled = (i == j) & (j == k) # 3行3列3层,对角线为True c = plt.get_cmap('RdBu')(np.linspace(0, 1, 27)).reshape(3, 3, 3, 4) # ax3d.voxels(filled) #filled为True的位置绘制六面体 ax3d.voxels(filled, facecolors=c) # filled为True的位置绘制六面体,并设置颜色 # ax3d = fig.add_subplot(122, projection='3d') # x,y,z=np.indices((3,4,5)) # ax3d.voxels(x,y,z,filled) plt.show()
运行效果如下: