python(matplotlib模块)

本文介绍了Python的matplotlib模块,讲解了如何绘制折线图、散点图、条形图和直方图。包括设置图片大小、保存图片、调整坐标轴属性等基础知识,并通过案例分析了不同图表在数据可视化中的应用,如气温变化、电影票房对比和用户行为统计等。
摘要由CSDN通过智能技术生成

matplotlib使用

1. matplotlib是什么?

python底层的绘图工具,执行效率很高。

2. matplotlib的基本要点:
  • 如何设置图片的大小;
  • 如何保存到本地;
  • x轴和y轴的描述信息;
  • 中文显示乱码问题;
  • 调整x轴和y轴的刻度;
  • x轴的刻度信息过长, 如何调整?
  • 标记最高点;
案例1: 假设一天中每隔两个小时气温变化的折线图绘制;
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 4). 中文显示乱码问题;
# fname的目录可通过shell命令:fc-list :lang=zh查找
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)
# 图表的x轴的数据, 是一个可迭代的数据类型
x_times = range(0, 24, 2)
# 图表的y轴的数据, 是一个可迭代的数据类型
y_temp = [15, 12, 13, 20, 23, 30, 15, 12, 13, 20, 23, 30]

# min(y_temp), max(y_temp)

#  1). 如何设置图片的大小;
plt.figure(figsize=(10, 10))

# 传入x和y轴的数据, 绘制图形;
plt.plot(x_times, y_temp)

# 3). x轴和y轴的描述信息;
plt.title("每天的气温变化(每隔两个小时)",fontproperties=titlefont )
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)

# 5). 调整x轴和y轴的刻度;
# 6). x轴的刻度信息过长, 如何调整?通过rotation参数调整刻度的倾斜度
plt.xticks(x_times, labels=["%s时0分"%(i) for i in x_times], fontproperties=myfont, rotation=45)
y_temp_range = range(min(y_temp), max(y_temp)+1, 2)
plt.yticks(y_temp_range, labels=["%s 。C"%(i) for i in y_temp_range], fontproperties=myfont)

# 7). 标记最高点;注意:x轴和y轴的索引必须相对应
# mark表示圆圈标记,edgecolors表示圆圈的颜色,s表示标记点的大小
plt.scatter(x_times[2], y_temp[2], color='b')
plt.scatter(x_times[2], y_temp[2], color='', marker='o', edgecolors='r', s=300)

# 2). 如何保存到本地;
plt.savefig('doc/temp.png')

# 在执行程序时显示图像
# plt.show()

在这里插入图片描述

折线图练习

需求1:

绘制10点到12点每分钟的气温, 如何绘制折线图观察每分钟气温的变化情况?
temps = [random.randint(20, 35) for i in range(120)]

import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 4). 中文显示乱码问题;
# fname的目录可通过shell命令:fc-list :lang=zh查找
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)
# 图表的x轴的数据, 是一个可迭代的数据类型
x_times=list(range(1,121))
# 图表的y轴的数据, 是一个可迭代的数据类型
y_temp = [random.randint(20,35) for i in range(120)]

# min(y_temp), max(y_temp)

#  1). 如何设置图片的大小;
plt.figure(figsize=(20, 15))

# 传入x和y轴的数据, 绘制图形;
plt.plot(x_times, y_temp)

# 3). x轴和y轴的描述信息;
plt.title("10点到12点每分钟的气温变化",fontproperties=titlefont )
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)

# 5). 调整x轴和y轴的刻度;
# 6). x轴的刻度信息过长, 如何调整?通过rotation参数调整刻度的倾斜度
x_labels=['10时%s分' %(i) for i in range(0,60,10)]+['11时%s分' %(j) for j in range(0,60,10)]
plt.xticks(x_times[::10], labels=x_labels, fontproperties=myfont, rotation=45)
y_temp_range = range(min(y_temp), max(y_temp)+1, 2)
plt.yticks(y_temp_range, labels=["%s 。C"%(i) for i in y_temp_range], fontproperties=myfont)

# 7). 标记最高点;注意:x轴和y轴的索引必须相对应
# mark表示圆圈标记,edgecolors表示圆圈的颜色,s表示标记点的大小
plt.scatter(x_times[2], y_temp[2], color='b')
plt.scatter(x_times[2], y_temp[2], color='', marker='o', edgecolors='r', s=300)

# 2). 如何保存到本地;
plt.savefig('doc/temp.jpg')

在这里插入图片描述

需求2:

假设大家在30岁的时候,根据自己的实际情况统计出来从11岁到30岁每年交的女(男)朋友的数量如a,请绘制出该数据的折线图,以便分析每年交女(男)朋友的数量走势;

import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 4). 中文显示乱码问题;
# fname的目录可通过shell命令:fc-list :lang=zh查找
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)
# 图表的x轴的数据, 是一个可迭代的数据类型
x_ages=list(range(11,31))
# 图表的y轴的数据, 是一个可迭代的数据类型
y_gf = [random.randint(0,5) for i in range(20)]

# min(y_temp), max(y_temp)

#  1). 如何设置图片的大小;
plt.figure(figsize=(20, 15))

# 传入x和y轴的数据, 绘制图形;
plt.plot(x_ages, y_gf)

# 3). x轴和y轴的描述信息;
plt.title("11岁到30岁每年交的女(男)朋友的数量",fontproperties=titlefont )
plt.xlabel("年龄", fontproperties=myfont)
plt.ylabel("数量", fontproperties=myfont)

# 5). 调整x轴和y轴的刻度;
# 6). x轴的刻度信息过长, 如何调整?通过rotation参数调整刻度的倾斜度
plt.xticks(x_ages, labels=['%s岁' %(i) for i in x_ages], fontproperties=myfont, rotation=45)



# 2). 如何保存到本地;
plt.savefig('doc/temp.jpg')

在这里插入图片描述

需求3:

假设大家30岁时统计出你和你同桌各自从11岁到30岁每年交女(男)朋友的数量如列表a和b,请在一个图中展示数据折线图,以便比较两人20年之间每年交女(男)朋友的数量走势

import random
from matplotlib import pyplot as plt
from matplotlib import font_manager

x_age = range(11, 31)
y_count_1 = [random.randint(0, 5) for i in range(20)]
y_count_2 = [random.randint(0, 5) for j in range(20)]
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=14)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=20)

plt.figure(figsize=(10, 10))

# 在同一个图里面绘制多条折线,
#  color: 线条颜色
#  linestyle: 线条的风格
#  linewidth: 线条的粗细
#  alpha: 透明度
plt.plot(x_age, y_count_1, color='g', linestyle='-.', linewidth=5, alpha=0.5, label="自己")
plt.plot(x_age, y_count_2, color='r', linestyle='--', linewidth=3, alpha=0.3, label="同桌")

# 添加图例
plt.legend(loc="upper right", prop=titlefont)

# 添加网格
plt.grid(alpha=0.3)

plt.title("11岁至30岁所交男(女)友个数", fontproperties=titlefont)
plt.xlabel("年龄", fontproperties=myfont)
plt.ylabel("女(男)友数量", fontproperties=myfont)


plt.xticks(x_age, labels=["%s岁" %(item) for item in x_age], fontproperties=myfont, rotation=45)
plt.scatter(x_age[0], y_count_1[0], c='r')

plt.savefig('doc/age02.png')

在这里插入图片描述

散点图绘制案例

3月和10月温度的变化趋势
from matplotlib import pyplot as plt
from matplotlib import font_manager

#  中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)

# 图表的x轴的数据, 是一个可迭代的数据类型
x_march = range(1, 32)
x_oct = range(50, 81)

# 图表的y轴的数据, 是一个可迭代的数据类型
y_temp_march = [11, 17, 16, 11, 12, 11, 12, 6, 6, 7, 8, 9, 12, 15, 14, 17, 18, 21, 16, 17, 20, 14, 15, 15, 15, 19, 21,
                22, 22, 22, 23]
y_temp_oct = [26, 26, 28, 19, 21, 17, 16, 19, 18, 20, 20, 19, 22, 23, 17, 20, 21, 20, 22, 15, 11, 15, 5, 13, 17, 10, 11,
              13, 12, 13, 6]

#   如何设置图片的大小;
plt.figure(figsize=(30, 10))

# 传入x和y轴的数据, 绘制图形;
plt.scatter(x_march, y_temp_march, label="3月的温度变化", color='r', alpha=0.5)
plt.scatter(x_oct, y_temp_oct, label="10月的温度变化", color='g', alpha=0.5)

# 3). x轴和y轴的描述信息;
plt.title("北京3,10月份每天白天的最高气温随时间(天)变化的散点图", fontproperties=titlefont)
plt.xlabel("时间", fontproperties=myfont)
plt.ylabel("温度", fontproperties=myfont)

# 5). 调整x轴和y轴的刻度;
# 6). x轴的刻度信息过长, 如何调整?
_x_info = list(x_march) + list(x_oct)
_x_labels_march = ["3月%s日" % (i) for i in x_march]
_x_labels_oct = ["10月%s日" % (i - 49) for i in x_oct]  # range(50, 81)
plt.xticks(_x_info[::3], labels=(_x_labels_march + _x_labels_oct)[::3], fontproperties=myfont, rotation=45)

plt.legend(prop=myfont, loc="upper left")
plt.grid(alpha=0.5)

# 2). 如何保存到本地;
plt.savefig('doc/scatter.png')

在这里插入图片描述

07_绘制单个条形图案例

电影票房数据对比图
from matplotlib import pyplot as plt
from matplotlib import font_manager

#  中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)


y_money = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49,
     10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
x_movies = ["流浪地球%s" %(i) for i in range(len(y_money))]

#   如何设置图片的大小;
plt.figure(figsize=(30, 10))
# (1,2)  -====('a', 10)
# 生成竖向的条形图
# plt.bar(range(len(x_movies)), y_money, color='orange', width=0.5)
# # 生成横向的条形图
plt.barh(range(len(x_movies)), y_money, color='orange', height=0.7)

# 修改刻度信息的配置
# plt.xticks(range(len(y_money)), labels=x_movies, fontproperties=myfont, rotation=45)
plt.yticks(range(len(y_money)), labels=x_movies, fontproperties=myfont, rotation=45)

# 3). x轴和y轴的描述信息;
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)
plt.savefig('doc/bar.png')

在这里插入图片描述

绘制多个条形图案例

三天间电影票房数据对比图
案例:

假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?
a = ["猩球崛起3:终极之战”,"敦刻尔克”,"蜘蛛侠:英雄归来”,"战狼2”]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

数据来源: http://www.cbooo.cn/movieday

from matplotlib import pyplot as plt
from matplotlib import font_manager

#  中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=18)
titlefont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=24)

x_movies_name = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
y_16 = [15746, 312, 4497, 319]
y_15 = [12357, 156, 2045, 168]
y_14 = [2358, 399, 2358, 362]

#   如何设置图片的大小;
plt.figure(figsize=(30, 10))

# 生成竖向的条形图
bar_width = 0.3

x_range = range(len(x_movies_name))
# ['a', 'b', 'c', 'd'] ===== [0, 1,2,3]
# [1,2,3,4]
# [3,4,4,4]

# [(0, 1), (1, 2), (2, 3), (3, 4)]
# [(0+0.3, 1), (1+0.3, 3)]
plt.bar([i - bar_width for i in x_range],y_14, color='green', width=bar_width, label="2017-09-14票房数据")
plt.bar(x_range, y_15, color='red', width=bar_width, label="2017-09-15票房数据")
plt.bar([i + bar_width  for i in x_range], y_16, color='orange', width=bar_width, label="2017-09-16票房数据")
# 修改刻度信息的配置
plt.xticks(range(len(x_movies_name)), labels=x_movies_name, fontproperties=myfont, rotation=45)

# 3). x轴和y轴的描述信息;
plt.title("某年内地电影票房前20的电影和电影票房数据", fontproperties=titlefont)
plt.xlabel("电影名", fontproperties=myfont)
plt.ylabel("电影票房(单位:亿)", fontproperties=myfont)
plt.savefig('doc/bar.png')

在这里插入图片描述

绘制直方图

直方图更多的应用场景:
  • 用户年龄的分布状态;
  • 一段时间内用户的点击数分布状态;
  • 用户活跃时间的分布状态.
120部电影时长的分布状态
import random
from matplotlib import  pyplot as plt

y = [random.randint(60,180) for i in range(250)]

# 直方图绘制数据分为20个分组;
plt.hist(y, 20)
plt.savefig('doc/01_hist.png')

在这里插入图片描述

设置组数
把数据分为多少组进行统计?
  • 如果数据在100个以内, 一般分为5-12组;
  • 组距:每个小组里面端点的距离;
  • 组数 = 极差 / 组距
import random
from matplotlib import pyplot as plt

y = [random.randint(60, 180) for i in range(250)]

d = 10  # 组距
# 组数
num_bins = (max(y) - min(y)) // d

# 设置x轴的刻度范围,
plt.xticks(list(range(min(y), max(y) + d))[::d])

plt.grid(linestyle='-.', alpha=0.3)

# 直方图绘制数据分为num_bins个分组;
plt.hist(y, num_bins)
plt.savefig('doc/02_hist.png')

在这里插入图片描述

案例_美国从家到上班地点所需时间的统计

哪些数据可以绘制直方图?
  • 连续的数据;
  • 没有统计过的数据; ------原始数据
    所以该案例不能时有直方图,可以采用折线图
from matplotlib import pyplot as plt

# 公司到家的的距离
interval = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90]
# 间距
width = [5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60]
# 对应的人数
quantity = [836, 2737, 3723, 3926, 3596, 1438, 3273, 642, 824, 613, 215, 57]
# 设置图形的大小
plt.figure(figsize=(10, 10))

# 绘制条形图
# plt.bar(range(12), quantity, width=1)
# 绘制折线图
plt.plot(interval, quantity)
# 设置x轴的刻度
# _x = [i-0.5 for i in range(12)]
# plt.xticks(_x, labels=interval)
plt.xticks(interval)
# 设置网格
plt.grid(linestyle='-.', alpha=0.5)

# gca====get current axis 获取当前的坐标轴
ax = plt.gca()
# 设置右边框和上边框没有颜色;
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 设置x轴为下边框
ax.xaxis.set_ticks_position('bottom')
# 设置y轴为作边框
ax.yaxis.set_ticks_position('left')
# 设置x轴和y轴的交点为(0, 0)点;
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0 ))

# 保存图片
plt.savefig('doc/03_bar.png')

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值