day 2 数据可视化-matplotlib
1 matplotlib
点击了解:matplotlib官网链接
matplotlib
是一个 Python的2D图库,以下是终端安装代码
pip install matplotlib
2 基本使用
import matplotlib.pyplot as plt
# 0.准备数据
x = [1, 2, 3, 4, 5, 6, 7]
y_shanghai = [17, 17, 18, 15, 11, 11, 13]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai)
# 3.图像显示
plt.show()
3 直折线
画出某城市11点到12点1小时内每分钟的温度变化折线图,
温度范围在15度~18度
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号
# 0.准备数据
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制图像
plt.plot(x, y_shanghai)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle="--",alpha=1)
# 3.图像显示
plt.show()
4 条形图
4.1 直方图
2019年贺岁片票房的数据
#票房单位亿元
movies = {
"流浪地球":40.78,
"飞驰人生":15.77,
"疯狂的外星人":20.83,
"新喜剧之王":6.10,
"廉政风云":1.10,
"神探蒲松龄":1.49,
"小猪佩奇过大年":1.22,
"熊出没·原始时代":6.71
}
展示电影和票房的代码如下:
import matplotlib.pyplot as plt
import random
# 设置显示中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
# 设置正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(20, 8), dpi=100)
movies = {
"流浪地球": 40.78,
"飞驰人生": 15.77,
"疯狂的外星人": 20.83,
"新喜剧之王": 6.10,
"廉政风云": 1.10,
"神探蒲松龄": 1.49,
"小猪佩奇过大年": 1.22,
"熊出没·原始时代": 6.71
}
plt.bar(range(len(movies)), list(movies.values()))
plt.xticks(range(len(movies)), list(movies.keys()))
plt.grid()
4.2 分组直方图
2019年春节贺岁片前五天的电影票房记录
movies = {
"流浪地球": [2.01, 4.59, 7.99, 11.83, 16],
"飞驰人生": [3.19, 5.08, 6.73, 8.10, 9.35],
"疯狂的外星人": [4.07, 6.92, 9.30, 11.29, 13.03],
"新喜剧之王": [2.72, 3.79, 4.45, 4.83, 5.11],
"廉政风云": [0.56, 0.74, 0.83, 0.88, 0.92],
"神探蒲松龄": [0.66, 0.95, 1.10, 1.17, 1.23],
"小猪佩奇过大年": [0.58, 0.81, 0.94, 1.01, 1.07],
"熊出没·原始时代": [1.13, 1.96, 2.73, 3.42, 4.05]
}
示例代码如下:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False
movies = {
"流浪地球": [2.01, 4.59, 7.99, 11.83, 16],
"飞驰人生": [3.19, 5.08, 6.73, 8.10, 9.35],
"疯狂的外星人": [4.07, 6.92, 9.30, 11.29, 13.03],
"新喜剧之王": [2.72, 3.79, 4.45, 4.83, 5.11],
"廉政风云": [0.56, 0.74, 0.83, 0.88, 0.92],
"神探蒲松龄": [0.66, 0.95, 1.10, 1.17, 1.23],
"小猪佩奇过大年": [0.58, 0.81, 0.94, 1.01, 1.07],
"熊出没·原始时代": [1.13, 1.96, 2.73, 3.42, 4.05]
}
plt.figure(figsize=(20, 8))
width = 0.75
bin_width = width / 5
ind = range(0, len(movies))
movie_data = list(movies.values())
print(movie_data)
every_day = []
for i in range(len(movie_data[0])):
every_day.append([
movie_data[0][i],
movie_data[1][i],
movie_data[2][i],
movie_data[3][i],
movie_data[4][i],
movie_data[5][i],
movie_data[6][i],
movie_data[7][i],
])
print(every_day)
for index in range(len(every_day)):
day_tickets = every_day[index]
xs = [i - (bin_width * (2 - index)) for i in ind]
plt.bar(xs, day_tickets, width=bin_width, label="第%d天" % (index + 1))
# 添加坐标上的数字
for ticket, x in zip(day_tickets, xs):
plt.annotate(ticket, xy=(x, ticket), xytext=(x - 0.1, ticket + 0.1))
# 设置图例
plt.legend()
plt.ylabel("单位:亿")
plt.title("春节前5天电影票房记录")
# 设置x轴的坐标
plt.xticks(ind, movies.keys())
#添加网格
plt.grid(True)
#展示图表
plt.show()
5 散点图
散点图的绘制,使用的是plt.scatter
方法,这个方法有以下参数:
x,y
:分别是x轴和y轴的数据集。两者的数据长度必须一致。s
:点的尺寸。如果是一个具体的数字,那么散点图的所有点都是一样大小,如果是一个序列,那么这个序列的长度应该和x轴数据量一致,序列中的每个元素代表每个点的尺寸。c
:点的颜色。可以为具体的颜色,也可以为一个序列或者是一个cmap
对象。marker
:标记点,默认是圆点,也可以换成其他的。- 其他参数:
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter
。
- 例如:需求:探究房屋面积和房屋价格的关系
房屋面积数据:
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,21.61, 483.21, 245.25, 399.25, 343.35]
房屋价格数据:
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34, 140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,30.74, 400.02, 205.35, 330.64, 283.45]
按0-4步骤
import matplotlib.pyplot as plt
import random
# 设置显示中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
# 设置正常显示符号
plt.rcParams['axes.unicode_minus'] = False
# 0.准备数据
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,30.74, 400.02, 205.35, 330.64, 283.45]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制散点图
plt.scatter(x, y)
# 3.显示图像
plt.show()
5.1 绘制多组数据
x=[random.random() for i in range(10)]
y1=[random.random() for i in range(10)]
y2=[random.random() for i in range(10)]
plt.scatter(x,y1,label="第一组数据")
plt.scatter(x,y2,label="第二组数据")
plt.legend()
在这里插入图片描述
6 饼图
在matplotlib
中,可以通过plt.pie
来实现,其中的参数如下:
x
:饼图的比例序列。labels
:饼图上每个分块的名称文字。explode
:设置某几个分块是否要分离饼图。autopct
:设置比例文字的展示方式。比如保留几个小数等。shadow
:是否显示阴影。textprops
:文本的属性(颜色,大小等)。- 其他参数:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.pie.html#matplotlib.pyplot.pie
edu = [59104, 1467937, 3579974]
labels = ['第一产业', '第二产业', '第三产业']
explode = [0.5, 0, 0]
colors = ['blue', 'pink', 'purple']
plt.pie(
x=edu, # 绘制的数据
labels=labels, # 占比的名字
autopct='%.1f%%', # 占比数值
explode=explode, # 饼图显示分隔间隔
labeldistance=0.5, #设置标签文本显示的距离
textprops={
'fontsize': 20,
'color': 'k'
},
colors=colors, # 饼图颜色
)
以下另外一组数据
edu=[0.2515,0.3724,0.3336,0.0368,0.0057]
labels=['中专','大专','本科','硕士','其他']
plt.pie(
x=edu,
labels=labels,
)
- 案例
# 设置绘画的主题风格
plt.figure(figsize=(10,8))
# 构造数据
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.axes(aspect='equal') # 保证饼图是圆 不是默认的椭圆
plt.pie(x=edu, # 数据
labels=labels, # 标签名称
autopct='%.2f%%', # 设置百分比格式 保留几位小数
colors=colors, # 使用自定义颜色
# radius = 1, # 设置饼图半径
# center = (80,80), # 设置圆点
labeldistance = 1.1, # 设置教育水平标签与圆心的距离
startangle =30, # 设置饼图的初始角度 逆时针
textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值
explode=explode, # 突出显示大专人群
pctdistance=0.5, # 占比和图距离
# shadow=True, # 阴影
# frame=True # frame 显示
)
plt.title('失信人员组成')
7 雷达图
数据图
properties = ['输出', 'KDA', '发育', '团战', '生存']
values = [40, 91, 44, 90, 95, 40]
theta = np.linspace(0, np.pi*2, 6)
plt.polar(theta, values)
plt.xticks(theta, properties, fontproperties=font)
plt.fill(theta, values)
plt.show()
matplotlib官方文档
链接: https://matplotlib.org/index.html
matplotlib官方文档