在做完数据分析后, 有时候需要将分析结果一目了然地展示出来, 此时便离不开 Python 可视化工具, Matplotlib 是 Python 中的一个 2D 绘图工具, 是另外一个绘图工具 seaborn 的基础包
先总结下绘制子图的步骤:
1. 确定绘制的图形形状 (如折线图 / 条状图 / 柱状图 / 饼图 / 散点图等)
2. 填充 x/y 轴的数据
3. 图形细节调整 (这里可以做很多调整, 如 x/y 轴文字参数说明, 颜色 / 线粗 / 柱状粗度, x/y 轴文字角度等)
4. 显示图像 (调用 show())
总结下一个区域同时绘制多个子图的步骤
1. 确定绘图区域大小
2. 确定每个子图在绘图区域的位置
3. 绘制每个子图 (步骤如上)
4. 显示图像 (调用 show())
绘制折线图
需求: 根据一张美国的失业率数据, 绘制出 1948 年 12 个月中的失业率折线图, 其中 x 轴表示月份, y 轴表示失业率
数据如下
- DATE VALUE
- 1948-01-01 3.4
- 1948-02-01 3.8
- 1948-03-01 4.0
- 1948-04-01 3.9
- 1948-05-01 3.5
- 1948-06-01 3.6
- 1948-07-01 3.6
- 1948-08-01 3.9
- 1948-09-01 3.8
- 1948-10-01 3.7
- 1948-11-01 3.8
- 1948-12-01 4.0
- unrate.csv
上代码
- # 导包
- import pandas as pd
- import matplotlib.pyplot as plt
- # 读取本地的 csv 文件, 里面的数据为美国失业率数据, 得到的数据为 DataFrame 类型
- unrate = pd.read_csv('unrate.csv')
- # 使用 pd 中的 pd.to_datetime 函数将 DATE 列的字符串类型数据转换成 pd 中的标准时间格式
- unrate['DATE'] = pd.to_datetime(unrate['DATE'])
- # 取出前面 12 条样本数据
- first_twelve = unrate[0:12]
- # 填充数据并绘制折线图, 第一个参数为 x 轴数据, 第二个参数为 y 轴数据
- plt.plot(first_twelve['DATE'], first_twelve['VALUE'])
- # 将 x 轴下面文字旋转 90 度
- plt.xticks(rotation=90)
- # 设置 x 轴的标签
- plt.xlabel('Month')
- # 设置 y 轴的标签
- plt.ylabel('Unemployment Rate')
- # 设置图标名称
- plt.title('Monthly Unemployment Trends, 1948')
- # 显示图像
- plt.show()
图像如图所示:
在一个区域绘制多个子图
有时候, 需要将多张图像在一块区域显示, 方便对比
上代码:
- # 导包
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- # 确定总绘图区宽和高分别为都是 3x6
- fig = plt.figure(figsize=(3, 6))
- # 添加第一个子图, 并且确定在总绘图区域的位置, add_subpolt(2,1,1), 前两个参数参数 2,1 表示将总绘图区域划分为两行 1 列 (跟矩阵表示很像)
- # 第 3 个参数表示该子图占总区域的第一个位置. 注 (将总区域分成 2 行 1 列后, 位置顺序从上到下, 从左到右, 从 1 开始递增)
- ax1 = fig.add_subplot(2,1,1)
- ax2 = fig.add_subplot(2,1,2)
- # 绘制子图
- ax1.plot(np.random.randint(1,5,5), np.arange(5))
- ax2.plot(np.arange(10)*3, np.arange(10))
- # 显示图像
- plt.show()
图像如图所示
在一张图中同时绘制多条曲线
需求: 在同一张图, 同时将 1948 到 1952 年的失业率展示出来, 曲线使用不同的颜色区分
上代码
- # 绘制 5 年内的失业率曲线图
- # 导包
- import numpy as np
- import pandas as pd
- import matplotlib.pypolt as plt
- # 读取本地数据
- unrate=pd.read_csv('UNRATE.csv')
- # 将字符串时间转换成 pd 中的时间格式
- unrate['DATE']=pd.to_datetime(unrate['DATE'])
- # 将年份时间转换成月份时间, 并新建列存起来, 因为需求需要将 5 年内的当年 12 个月内的失业率展示出来, 此时再用年时间作为 x 轴下标就不合适了
- unrate['MONTH']=unrate['DATE'].dt.month
- # 设置 5 个颜色数组, 分别表示 5 条曲线颜色
- colors=['red','green','blue','black','yellow']
- # 设置总绘图区域大小, 需要在调用绘图函数之前调用才有效果
- plt.figure(figsize=(10,6))
- # 遍历 5 次
- for i in range(5):
- #取出当年 12 个月的数据
- data12=unrate[12*i:12*(i+1)]
- #x 轴数据
- data_x=data12['MONTH']
- #y 轴数据
- data_y=data12['VALUE']
- #当年的曲线的标签
- label=str(1948+i)
- # 绘制当年的曲线图
- plt.plot(data_x,data_y,c=colors[i],label=label)
- # 设置 x 轴标签
- plt.xlabel('MONTH')
- # 设置 y 轴标签
- plt.ylabel('unrate')
- # 设置图标名称
- plt.title('US-unrae,1948-1952')
- # 设置曲线标签说明, loc='best'表示自己选择合适的位置来摆放
- plt.legend(loc='best')
- # 显示图像
- plt.show()
得到的图像:
绘制条形图
直方图和条形图的区别: 由于分组数据具有连续性, 直方图中的各矩形通常是连续排列, 而条形图则是分开排列此外直方图的高度表示各小组内数据个数, 而条形图高度表示某项目内的数据个数
fandango_scores.csv
上代码:
- # 导包
- import pandas as pd
- import matplotlib.pyplot as plt
- from numpy import arange
- # 读取电影评分数据
- reviews = pd.read_csv('fandango_scores.csv')
- # 取出需要展示的列名
- cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
- # 取出需要展示的样本数据
- norm_reviews = reviews[cols]
- # 评分数据的列名
- num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
- # 取出第一部电影的评分样本数据
- bar_heights = norm_reviews.loc[0, num_cols].values
- # 条形图的位置
- bar_positions = arange(5) + 0.75
- tick_positions = range(1,6)
- fig, ax = plt.subplots()
- # 绘制条形图, 第一个参数为 x 轴数据, 第二个参数为 y 轴数据, 第三个参数为每个条形的宽度
- ax.bar(bar_positions, bar_heights,0.5)
- # 设置 x 轴标签的位置
- ax.set_xticks(tick_positions)
- # 设置 x 轴标签的名字和角度
- ax.set_xticklabels(num_cols, rotation=45)
- # 设置 x 轴标签
- ax.set_xlabel('Rating Source')
- # y 轴标签
- ax.set_ylabel('Average Rating')
- # 标题
- ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)')
- plt.show()
绘制的图片:
绘制直方图
直方图一般用来统计一定范围内的数据
上代码
- import pandas as pd
- import matplotlib.pyplot as plt
- reviews = pd.read_csv('fandango_scores.csv')
- cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue']
- norm_reviews = reviews[cols]
- # 对评分进行数量统计
- fandango_distribution = norm_reviews['Fandango_Ratingvalue'].value_counts()
- # 排序索引
- fandango_distribution = fandango_distribution.sort_index()
- imdb_distribution = norm_reviews['IMDB_norm'].value_counts()
- imdb_distribution = imdb_distribution.sort_index()
- fig, ax = plt.subplots()
- # 绘制直方图
- ax.hist(norm_reviews['Fandango_Ratingvalue'],bins=20)
- plt.show()
绘制所得图像:
绘制散点图
上代码:
- # 导包
- import pandas as pd
- import matplotlib.pyplot as plt
- from numpy import arange
- # 读取电影评分数据
- norm_reviews = pd.read_csv('fandango_scores.csv')
- # 取出需要展示的列名
- cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
- # 取出需要展示的样本数据
- norm_reviews = reviews[cols]
- fig, ax = plt.subplots()
- # 绘制散点图
- ax.scatter(norm_reviews['Fandango_Ratingvalue'], norm_reviews['RT_user_norm'])
- ax.set_xlabel('Fandango')
- ax.set_ylabel('Rotten Tomatoes')
- plt.show()
绘制所得图片:
绘制盒图
箱形图 (英文: Box-plot), 又称为盒须图盒式图盒状图或箱线图, 是一种用作显示一组数据分散情况资料的统计图因型状如箱子而得名在各种领域也经常被使用, 常见于品质管理不过作法相对较繁琐它能显示出一组数据的最大值最小值中位数下四分位数及上四分位数
上代码:
- import pandas as pd
- import matplotlib.pyplot as plt
- reviews = pd.read_csv('fandango_scores.csv')
- cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue']
- norm_reviews = reviews[cols]
- num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue']
- 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://www.cnblogs.com/flowyourheart/p/Python-ke-shi-hua-kuMatplotlib-shi-yong-zong-jie.html