跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

2021-08-10

python之matplotlib库的使用 本人是在学习数据分析的萌新,希望通过边学习,边记录的形式加深自己的印象,如本文中有说法不当的地方欢迎指出,大家一起交流学习吧。

一.折线统计图 ​ (1)设计折线统计图的步骤如下

​ 1)设置中文字体,防止使用中文标题和坐标是出现乱码

​ 2)准备数据,在此用随机数来生成数据

​ 3)画折线统计图

​ 4)设置x,y轴坐标的标度

​ 5)增加标题和坐标描述,让你画的统计图更加清晰

​ 6)把做好的图片保存成文件并打印到控制台

import matplotlib.pyplot as plt

import random #(1)设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei', 'KaiTi', 'FangSong'] # 汉字字体,优先使用黑体,如果找不到黑体,则使用楷体 plt.rcParams['font.size'] = 12 # 字体大小 plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(20,8),dpi=80) #figsize设置图片的大小,20,8比例比较好,dpi表示清晰度 #(2)准备数据 x = range(60) y = [random.uniform(15, 18) for i in x] y_l =[random.uniform(1, 3) for i in x] x_ch = ['11点{}分'.format(i) for i in x] #列表表达式、 y_ticks = range(40) #(3)画折现图,第一个列表表示x轴坐标,第二个列表表示点的y轴坐标 plt.plot(x, y, label='上海')# lable:表示含义 ,color:表示颜色 ,linestyle表示折线的类型 plt.plot(x, y_l, label='北京', color='r', linestyle='--') #(4)设置x,y轴坐标 plt.xticks(x[::5], x_ch[::5]) #设置x,y轴坐标内容,第一个表示每五个进行一次标记,第二个为第一个对应标记内容 plt.yticks(y_ticks[::5])#设置y轴坐标内容 注意:xticket、yticket要放在plt.show之前 #(5)增加标题,坐标描述 plt.xlabel('时间') plt.ylabel('温度') plt.title('某个城市11.00~12.00温度变化情况') plt.legend(loc='best') # best表示最适合的位置 #(6)保存图片 plt.savefig('tianqi.jpg')#将图片保存到当前文件夹下 plt.show()#将设计好的统计图展示

​ (2)案例做好的效果图

(3)部分颜色,折线类型,位置摆放的类型

plt.plot(x, y_l, label='北京', color='r', linestyle='--') #color为左,linestyle为右 plt.legend(loc='best') # best表示最适合的位置,loc可以更换如下表参数

!

二.柱状统计图(bar)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei', 'KaiTi', 'FangSong'] # 汉字字体,优先使用黑体,如果找不到黑体,则使用楷体 plt.rcParams['font.size'] = 12 # 字体大小 plt.rcParams['axes.unicode_minus'] = False # 创建fig对象 plt.figure(figsize=(20, 8)) movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记'] first_day = [10587.6,10062.5,1275.7] first_weekend=[36224.9,34479.6,11830] # 准备数据 # movie_name = ['雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案', '寻梦环游记', '全球风暴', '降魔传', '追捕', '七十七天', '密战', '狂兽', '其它'] # y = [73853, 57767, 22354, 15969, 14839, 8725, 8716, 8318, 7916, 6764, 52222]

# 放进横坐标的数字列表 x = range(len(movie_name))

# 画图 plt.bar(x, first_day, width=0.2,label="首日票房") plt.bar([i+0.2 for i in x], first_weekend, width=0.2,label="首周票房") #因为x的宽度是0.2,如果再想将首周票房与首日票房放在一块,需要将首周票房往左移动0.2宽度,这样就可以一同显示 plt.xticks([i+0.1 for i in x],movie_name) #这里加0.1的目的是让x轴下标对齐,如果不加就只会对齐首日票房的正中间,也就是0.2/2=0.1的位置,而我们现在要对齐的是(0.2+0.2)/2=0.2的位置,所以要在原来的0.1的基础上加上0.1 plt.xlabel('电影名') plt.ylabel('票房') plt.title('热门电影票房对比') plt.legend(loc='best') plt.show()

效果如图所示

三.直方图(hist)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei', 'KaiTi', 'FangSong'] # 汉字字体,优先使用黑体,如果找不到黑体,则使用楷体 plt.rcParams['font.size'] = 12 # 字体大小 plt.rcParams['axes.unicode_minus'] = False

# 组数:数据按照不同的范围分组,分成的组成为组数 = 极差/组距 (max-mix)/bins # 组距:每一组两个端点的差" plt.figure(figsize=(20, 8)) time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150] # 组距 2分钟 组数 bins = 2 groups = int((max(time)-min(time))/2) # 画直方图 # normed: 纵坐标的显示频率 plt.hist(time,groups) plt.xticks(list(range(min(time),max(time)))[::2]) #这里x轴的意思是:从这组数据的最小值到最大值没两分钟标记一次 plt.xlabel('电影时长大小') plt.ylabel('电影的数据量') # 增加网格显示 plt.grid(None, linestyle='--', alpha=1) plt.show()

效果如图所示

四.饼图(axis)

import matplotlib.pyplot as plt

#设置中文字体 plt.figure(figsize=(20, 8)) plt.rcParams['font.sans-serif'] = ['SimHei', 'KaiTi', 'FangSong'] # 汉字字体,优先使用黑体,如果找不到黑体,则使用楷体 plt.rcParams['font.size'] = 12 # 字体大小 plt.rcParams['axes.unicode_minus'] = False movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它'] place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105] # 绘制饼图autopct用来显示数量 plt.pie(place_count,labels=movie_name,autopct='%1.2f%%',colors=['b','r','g','y','c','m','y','r','c','g','g']) # 绘制正圆 plt.axis('equal') plt.legend(loc='best') plt.title('排片占比示意图') plt.show()

效果如图所示

如果要将饼图的某快区域分开,操作如下

import matplotlib.pyplot as plt

plt.figure(figsize=(20, 8)) plt.rcParams['font.sans-serif'] = ['SimHei', 'KaiTi', 'FangSong'] # 汉字字体,优先使用黑体,如果找不到黑体,则使用楷体 plt.rcParams['font.size'] = 12 # 字体大小 plt.rcParams['axes.unicode_minus'] = False labels = ['Frogs', 'Hogs', 'Dogs', 'Logs'] sizes = [15, 30, 45, 10] # 将某部分爆炸出来, 使用括号将第一块分割出来,数值的大小是分割出来的与其他两块之间的间隙 explode = (0, 0.1, 0, 0) # 分别对应labels fig1, ax1 = plt.subplots() # pctdistance, 百分比的text离圆心的距离 ax1.pie(sizes,explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90) ax1.axis('equal') plt.show()

效果如图所示

相关文章