Table of Contents
一. Matplotlib介绍
官网: https://matplotlib.org/
中文官网: https://www.matplotlib.org.cn/intro/
Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
Matplotlib 可以用来绘制各种静态,动态,交互式的图表。
Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。
Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。
plt常用参数有:
plt常画图例有:
如果不熟悉语法,可以在官网查找:
https://matplotlib.org/stable/search.html?q=figure#
二. 数据源介绍
2.1 UNRATE.csv
这个数据集是美国历年的失业率数据集
2.2 fandango_score_comparison.csv
电影评分的数据集
三. 实操
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()
测试记录:
我们从上图可以看到,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()
测试记录:
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()
测试记录:
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()
测试记录:
3.2 子图操作
通过如下操作,可以实现在同一个画板里面画出多张图
代码:
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()
测试记录:
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()
测试记录:
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() # 显示柱状图
测试记录:
3.4 散点图
散点图也叫 X-Y 图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。
通过观察散点图上数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。
数据的相关关系主要分为:正相关(两个变量值同时增长)、负相关(一个变量值增加另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如下图所示。那些离点集群较远的点我们称为离群点或者异常点。
散点图的绘制,使用的是 plt.scatter 方法,这个方法有以下参数:
- x,y :分别是x轴和y轴的数据集。两者的数据长度必须一致。
- s :点的尺寸。如果是一个具体的数字,那么散点图的所有点都是一样大小,如果是一个序
列,那么这个序列的长度应该和x轴数据量一致,序列中的每个元素代表每个点的尺寸。 - c :点的颜色。可以为具体的颜色,也可以为一个序列或者是一个 cmap 对象。
- marker :标记点,默认是圆点,也可以换成其他的。
- 其他参数参考: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()
测试记录:
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.5IQR,如果存在离群点大于最大观测值,则胡须上限为最大观测值,离群点单独以点汇出。如果没有比最大观测值大的数,则胡须上限为最大值。
代码:
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()
测试记录:
参考:
- https://study.163.com/course/introduction.htm?courseId=1003590004#/courseDetail?tab=1
- https://www.yisu.com/zixun/606180.html
- https://www.pudn.com/news/6228cca69ddf223e1ad0fba4.html
- https://blog.csdn.net/weixin_44327634/article/details/123748554