数据分析之matplotlib篇
Posted 白鳯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析之matplotlib篇相关的知识,希望对你有一定的参考价值。
数据分析之matplotlib篇
文章目录
matplotlib简介
数据分析:将大量的数据进行统计和整理,得出结论,为后序的决策提供数据支持
学习matplotlib?
- 能将数据进行可视化,更直观的呈现
- 使数据更加客观、更具说服力
matplotlib
:最流向的python底层绘图库,主要做数据可视化图表,名字取材于MATLIB,模仿它构建。
matplotlib基础
简单示例
from matplotlib import pyplot as plt
import random
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
x = range(0, 120)
y = [random.randint(20, 35) for i in range(0, 120)]
#设置图片大小(图像模糊的时候可以传入dpi参数,让图片更加清晰)
fig = plt.figure(figsize=(11, 8), dpi=80)
#绘图
plt.plot(x, y)
#调整x的刻度
_xtick_labels = ["10点{}分".format(i * 10) for i in range(6)]
_xtick_labels += ["11点{}分".format(i * 10) for i in range(6)]
#rotation刻度字体旋转的度数
plt.xticks(list(x)[::10], _xtick_labels, rotation=45)
#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度/℃")
plt.title("10点到12点每分钟的气温变化情况")
#保存
plt.savefig("./简单示例t1.png")
plt.show()
图示如下
绘制多次图形和不同差异图形
假如在同一张图上绘制你和朋友11岁至31岁的聚会情况
from matplotlib import pyplot as plt
import random
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
y_1 = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
y_2 = [1, 0, 3, 1, 2, 2, 3, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
x = range(11, 31)
#设置图片大小
fig = plt.figure(figsize=(12, 5), dpi=80)
#绘图
"""
绘制时可指定
color = 'r' 线条颜色
linestyle = '--' 线条风格
linewidth = 5 线条粗细
alpha = 0.5 透明度
"""
plt.plot(x, y_1, label="自己", color="orange")
plt.plot(x, y_2, label="同桌", color="cyan")
#设置的刻度
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, _xtick_labels)
plt.yticks(range(0, 9))
#绘制网格
plt.grid(alpha=0.5, linestyle=":")
#添加图例
plt.legend(loc="upper right")
#添加描述信息
plt.xlabel("年龄")
plt.ylabel("聚会/次")
plt.title("11岁到26岁每年聚会情况")
plt.show()
图示如下
常用统计图对比
-
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点
:能够显示数据的变化趋势,反应事物的变化情况(变化
) -
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况
特点
:绘制连续的数据,展示一组或者多组数据的分布情况(统计
) -
条形图:排列在工作表的行或列中的数据可以绘制到条形图中。
特点
:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计
) -
散点图:用两组数据构成多个坐标点,考察坐标点的分布,
判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点
:判断变量之间是否存在数量关系趋势,展示离群点(分布规律
)
绘制散点图
代码示例
from matplotlib import pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
y_3 = [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_10 = [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]
x_3 = range(1, 32)
x_10 = range(51, 82)
#设置图形大小
plt.figure(figsize=(11, 7), dpi=80)
#使用scatter方法绘制散点图,和之前绘制折线图的唯一区别
plt.scatter(x_3, y_3, label='3月份')
plt.scatter(x_10, y_10, label='10月份')
#调整x的刻度
_x = list(x_3) + list(x_10)
_xtick_labels = ["3月{}日".format(i) for i in x_3]
_xtick_labels += ["10月{}日".format(i - 50) for i in x_10]
plt.xticks(_x[::5], _xtick_labels[::5], rotation=45)
#添加图例
plt.legend(loc="upper right")
#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("标题")
#展示
plt.show()
图示如下
绘制条形图
绘制基本条形图
代码示例
#绘制横着的条形图
from matplotlib import pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
a = ["低俗小说", "速度与激情8", "燃情岁月", "辛德勒的名单", "勇敢的心", "乱世佳人",
"灿烂人生", "美丽人生", "生活多美好", "教父", "霍比特人", "泰坦尼克号"]
b = [36.01, 25.90, 17.53, 29.60, 42.40, 33.53, 37.80, 40.52, 60.43, 57.33, 43.90, 50.99]
#设置图形大小
plt.figure(figsize=(10, 7), dpi=80)
#绘制条形图
plt.barh(range(len(a)), b, height=0.4, color='cyan')
#设置字符串到x轴
plt.yticks(range(len(a)), a)
#若绘制竖着的条形图,相应代码如下
#plt.bar(range(len(a)), b, width=0.3)
#plt.xticks(range(len(a)), a, rotation=40)
plt.grid(alpha=0.4, color='pink')
#添加描述信息
plt.ylabel("电影")
plt.xlabel("票房/亿")
plt.title("xxx年电影票房统计")
plt.show()
图示如下:
绘制多次条形图
代码示例
from matplotlib import pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
a = ["傲慢与偏见", "茶花女", "乱世佳人", "理智与情感"]
b_16 = [1746, 324, 4466, 389]
b_15 = [1247, 158, 2039, 189]
b_14 = [2490, 389, 3900, 289]
bar_width = 0.2
x_14 = list(range(len(a)))
x_15 = [i + bar_width for i in x_14]
x_16 = [i + bar_width * 2 for i in x_14]
#设置图形大小
plt.figure(figsize=(10, 7), dpi=80)
plt.bar(x_14, b_14, width=bar_width, label="9月14日")
plt.bar(x_15, b_15, width=bar_width, label="9月15日")
plt.bar(x_16, b_16, width=bar_width, label="9月16日")
#设置图例
plt.legend(loc="upper right")
#设置x的刻度
plt.xticks(x_15, a)
plt.show()
图示如下:
绘制直方图
简单示例
#180部门电影时长
from matplotlib import pyplot as plt
import random
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
a = [random.randint(0, 100) + 90 for i in range(1, 181)]
#计算组数
d = 5 #组距
num_bins = (max(a) - min(a)) // d
#设置图形大小
plt.figure(figsize=(11, 6 ), dpi=80)
plt.hist(a, num_bins, normed=True)
#设置x轴的刻度
plt.xticks(range(min(a), max(a) + d, d))
plt.grid(alpha=0.4, color='cyan')
plt.show()
图示如下:
属性设置
1、位置loc
loc='center left'
等价于loc=6
'best': 0,
'upper right': 1,
'upper left': 2,
'lower left': 3,
'lower right': 4,
'right': 5,
'center left': 6,
'center right': 7,
'lower center': 8,
'upper center': 9,
'center': 10,
2、线型linestyle
- 实线
-- 虚线
-. 形式即为-.
: 细小的虚线
3、折线点型marker
s--方形
h--六角形
H--六角形
*--*形
+--加号
x--x形
d--菱形
D--菱形
p--五角形
其他图形绘制
如下图所示
随便点进去一个你感兴趣的图示,其中有完整的绘图代码,可更改其数据,如
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse
# Fixing random state for reproducibility
np.random.seed(19680801)
NUM = 200
ells = [Ellipse(xy=np.random.rand(3) * 10,
width=np.random.rand(), height=np.random.rand(),
angle=np.random.rand() * 360)
for i in range(NUM)]
fig, ax = plt.subplots(subplot_kw={'aspect': 'equal'})
for e in ells:
ax.add_artist(e)
e.set_clip_box(ax.bbox)
e.set_alpha(np.random.rand())
e.set_facecolor(np.random.rand(3))
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
plt.show()
效果图如下
绘图网站推荐
参考资料
https://matplotlib.org/
以上是关于数据分析之matplotlib篇的主要内容,如果未能解决你的问题,请参考以下文章
谈谈Python实战数据可视化之matplotlib模块(实战篇)
为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误