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()
效果如图所示