暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python数据分析与机器学习4-Matplotlib

原创 只是甲 2022-07-06
783

Table of Contents

一. Matplotlib介绍

官网: https://matplotlib.org/
中文官网: https://www.matplotlib.org.cn/intro/

Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

Matplotlib 可以用来绘制各种静态,动态,交互式的图表。

Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。

Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。

plt常用参数有:
image.png

image.png

plt常画图例有:
image.png

如果不熟悉语法,可以在官网查找:
https://matplotlib.org/stable/search.html?q=figure#
image.png

二. 数据源介绍

2.1 UNRATE.csv

这个数据集是美国历年的失业率数据集
image.png

2.2 fandango_score_comparison.csv

电影评分的数据集
image.png

三. 实操

3.1 折线图

3.1.1 单个折线图

代码:

import pandas as pd import matplotlib.pyplot as plt unrate = pd.read_csv('E:/file/unrate.csv') unrate['DATE'] = pd.to_datetime(unrate['DATE']) # 选择前12行 first_twelve = unrate[0:12] # 指定x轴和y轴的值 plt.plot(first_twelve['DATE'], first_twelve['VALUE']) # 调整x轴数值显示角度 plt.xticks(rotation=90) # 指定x轴、y轴及标题的 标签 plt.xlabel('Month') plt.ylabel('Unemployment Rate') plt.title('Monthly Unemployment Trends, 1948') # 开始画图 plt.show()

测试记录:
image.png

我们从上图可以看到,x轴只显示了6个月份,其实有12个月份,其实这是被优化后的结构。

在网上找了一堆,后面发现可以调整x轴显示数值。

解决方法:
了解xticks()函数中参数的含义,利用其[labels]参数解决X轴标签显示不全的现象,xticks()函数参数解释如下

xticks()中有3个参数:
xticks(locs, [labels], **kwargs)
locs参数是一个数组,用于设置X轴刻度间隔
[labels]参数也是一个数组,用于设置每个间隔的显示标签
**kwargs可用于设置标签字体倾斜度和颜色等

调整后的代码:

import pandas as pd import matplotlib.pyplot as plt unrate = pd.read_csv('E:/file/unrate.csv') unrate['DATE'] = pd.to_datetime(unrate['DATE']) # 选择前12行 first_twelve = unrate[0:12] # 指定x轴和y轴的值 plt.plot(first_twelve['DATE'], first_twelve['VALUE']) # 指定x轴、y轴及标题的 标签 plt.xlabel('Month') plt.ylabel('Unemployment Rate') plt.title('Monthly Unemployment Trends, 1948') # 指定x轴的值,全部输出 time_list = first_twelve['DATE'].tolist() label_list=[] for i in range(0,len(time_list),1): label_list.append(time_list[i]) # 调整x轴数值显示角度 plt.xticks(label_list,rotation=90) # 开始画图 plt.show()

测试记录:
image.png

3.1.2 多个折线图

代码:

import pandas as pd import matplotlib.pyplot as plt unrate = pd.read_csv('E:/file/unrate.csv') unrate['DATE'] = pd.to_datetime(unrate['DATE']) # 提取时间中的月份 unrate['MONTH'] = unrate['DATE'].dt.month # 计算具有指定长宽比的图形的宽度和高度 fig = plt.figure(figsize=(6,3)) # 我们分别提取 1948年和1949年的数据,然后用颜色标记出来 plt.plot(unrate[0:12]['MONTH'], unrate[0:12]['VALUE'], c='red') plt.plot(unrate[12:24]['MONTH'], unrate[12:24]['VALUE'], c='blue') plt.show()

测试记录:
image.png

3.1.3 多个折线图(使用循环)

代码:

import pandas as pd import matplotlib.pyplot as plt unrate = pd.read_csv('E:/file/unrate.csv') unrate['DATE'] = pd.to_datetime(unrate['DATE']) # 提取时间中的月份 unrate['MONTH'] = unrate['DATE'].dt.month # 计算具有指定长宽比的图形的宽度和高度 fig = plt.figure(figsize=(10,6)) # 定义每条线的颜色 colors = ['red', 'blue', 'green', 'orange', 'black'] # 通过循环实现 for i in range(5): start_index = i*12 end_index = (i+1)*12 subset = unrate[start_index:end_index] label = str(1948 + i) plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i], label=label) plt.legend(loc='best') #print help(plt.legend) plt.show()

测试记录:
image.png

3.2 子图操作

通过如下操作,可以实现在同一个画板里面画出多张图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8NkuicU3-1657072173630)(https://upload-images.jianshu.io/upload_images/2638478-16b70ccf4b564c71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

代码:

import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(3,2,1) ax2 = fig.add_subplot(3,2,2) ax2 = fig.add_subplot(3,2,6) plt.show()

测试记录:
image.png

3.3 条形图

柱状图(bar chart): 用长方形(柱子)的长度表示数值的统计图表,又称为条形图。柱状图常用来对比两个以上的数值,适用于较小的数据集。

Matplotlib创建柱状图的接口:bar(x, height, width, bottom, align, color)
(1)x: 柱子的x轴坐标
(2)height: 柱子高度,y轴坐标
(3)width: 柱子宽度,默认0.8
(4)bottom: 柱子底部的y轴坐标,默认为0
(5)align: 柱子与x轴坐标的对齐方式,默认’center’
(6)color: 柱子颜色
(7)orientation: 柱子方向,‘horizontal’ or ‘vertical’

3.3.1 例1

代码:

import matplotlib.pyplot as plt import pandas as pd from numpy import arange reviews = pd.read_csv('E:/file/fandango_scores.csv') num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'] norm_reviews = reviews[num_cols] # 指定的值,第0行和指定的5个列 bar_heights = norm_reviews.loc[0, num_cols].values #print (bar_heights) bar_positions = arange(5) + 0.75 #print (bar_positions) # 使用变量ax来表示单个的a轴 fig, ax = plt.subplots() # matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs) ax.bar(bar_positions, bar_heights, 0.5) ax.set_xlabel('Rating Source') ax.set_ylabel('Average Rating') ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)') plt.show()

测试记录:
image.png

3.3.2 例2

代码:

import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 X_data = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] Y_data = [13, 16, 17, 21, 23, 28, 25, 21, 17, 15, 14, 10] plt.style.use('ggplot') #添加网格线 plt.title("柱状图标题") #柱状图标题 plt.xlabel("X轴名称") #X轴名称 plt.ylabel("Y轴名称") #Y轴名称 plt.bar(X_data, Y_data, color="blue") #绘制柱状图 for i in range(len(Y_data)): plt.text(i, Y_data[i] + 0.5, "%s" % Y_data[i], va='center') #显示y轴数据 plt.savefig('柱状图2.jpg') # 保存到本地文件夹,当前路径下 plt.show() # 显示柱状图

测试记录:
image.png

3.4 散点图

散点图也叫 X-Y 图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。

通过观察散点图上数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。

数据的相关关系主要分为:正相关(两个变量值同时增长)、负相关(一个变量值增加另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如下图所示。那些离点集群较远的点我们称为离群点或者异常点。

image.png

散点图的绘制,使用的是 plt.scatter 方法,这个方法有以下参数:

  1. x,y :分别是x轴和y轴的数据集。两者的数据长度必须一致。
  2. s :点的尺寸。如果是一个具体的数字,那么散点图的所有点都是一样大小,如果是一个序
    列,那么这个序列的长度应该和x轴数据量一致,序列中的每个元素代表每个点的尺寸。
  3. c :点的颜色。可以为具体的颜色,也可以为一个序列或者是一个 cmap 对象。
  4. marker :标记点,默认是圆点,也可以换成其他的。
  5. 其他参数参考:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=matplotlib%20pyplot%20scatter#matplotlib.pyplot.scatter

代码:

import matplotlib.pyplot as plt import pandas as pd from numpy import arange reviews = pd.read_csv('E:/file/fandango_scores.csv') num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'] norm_reviews = reviews[num_cols] #Switching Axes fig = plt.figure(figsize=(5,10)) ax1 = fig.add_subplot(2,1,1) ax2 = fig.add_subplot(2,1,2) ax1.scatter(norm_reviews['Fandango_Ratingvalue'], norm_reviews['RT_user_norm']) ax1.set_xlabel('Fandango') ax1.set_ylabel('Rotten Tomatoes') ax2.scatter(norm_reviews['RT_user_norm'], norm_reviews['Fandango_Ratingvalue']) ax2.set_xlabel('Rotten Tomatoes') ax2.set_ylabel('Fandango') plt.show()

测试记录:
image.png

3.5 盒图

盒图是在1977年由美国的统计学家约翰·图基(John Tukey)发明的。它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(max)。也可以往盒图里面加入平均值(mean)。如上图。下四分位数、中位数、上四分位数组成一个“带有隔间的盒子”。上四分位数到最大值之间建立一条延伸线,这个延伸线成为“胡须(whisker)”。
由于现实数据中总是存在各式各样地“脏数据”,也成为“离群点”,于是为了不因这些少数的离群数据导致整体特征的偏移,将这些离群点单独汇出,而盒图中的胡须的两级修改成最小观测值与最大观测值。这里有个经验,就是最大(最小)观测值设置为与四分位数值间距离为1.5个IQR(中间四分位数极差)。即

IQR = Q3-Q1,即上四分位数与下四分位数之间的差,也就是盒子的长度。
最小观测值为min = Q1 - 1.5IQR,如果存在离群点小于最小观测值,则胡须下限为最小观测值,离群点单独以点汇出。如果没有比最小观测值小的数,则胡须下限为最小值。
最大观测值为max = Q3 -1.5
IQR,如果存在离群点大于最大观测值,则胡须上限为最大观测值,离群点单独以点汇出。如果没有比最大观测值大的数,则胡须上限为最大值。

代码:

import matplotlib.pyplot as plt import pandas as pd from numpy import arange reviews = pd.read_csv('E:/file/fandango_scores.csv') num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'] norm_reviews = reviews[num_cols] fig, ax = plt.subplots() ax.boxplot(norm_reviews[num_cols].values) ax.set_xticklabels(num_cols, rotation=90) ax.set_ylim(0,5) plt.show()

测试记录:
image.png

参考:

  1. https://study.163.com/course/introduction.htm?courseId=1003590004#/courseDetail?tab=1
  2. https://www.yisu.com/zixun/606180.html
  3. https://www.pudn.com/news/6228cca69ddf223e1ad0fba4.html
  4. https://blog.csdn.net/weixin_44327634/article/details/123748554
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论