数据分析之matplotlib篇

Posted 白鳯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析之matplotlib篇相关的知识,希望对你有一定的参考价值。

数据分析之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--五角形

其他图形绘制

matplotlib官网示例

如下图所示

随便点进去一个你感兴趣的图示,其中有完整的绘图代码,可更改其数据,如

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/

【python教程】数据分析——numpy、pandas、matplotlib

matplotlib轻松解决中文乱码问题

python画图的图例legend设置。

Python数据分析:折线图和散点图的绘制

以上是关于数据分析之matplotlib篇的主要内容,如果未能解决你的问题,请参考以下文章

谈谈Python实战数据可视化之matplotlib模块(实战篇)

为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误

matplotlib可视化篇之并列柱状图--直方图(3)

三维散点图:Python 之matplotlib篇

译ECMAScript 2016, 2017, 2018 新特性之必读篇

Python知识点复习之科研休闲篇