您的位置:首页 > 编程语言 > Python开发

纯新手入门学习python数据可视化:Matplotlib

2020-07-12 16:46 477 查看

本文参考文章:https://www.cnblogs.com/magle/p/7389240.html

Python之Matplotlib

写在前面:因为本人是属于纯小白,并且是想从Matplotlib开始入门,所以文中不止单单的涉及到Matplotlib的相关知识,只要有不会的我都会去查一下然后补充进去,所以内容稍显凌乱,但是方便新手理解各个代码段。
另外,来回切换网页干扰太多,所以本文汉字较少,解释说明大部分直接写在了代码块中,方便复制代码运行的同时可以看解释说明,避免来回切换屏幕。

导入相关模块

import matplotlib.pyplot as plt#Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
import pandas as pd# pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
import numpy as np#numpy是Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

基本图表

散点图:scatter

N = 1000
x = np.random.randn(N)#randn函数返回一个或一组样本,具有标准正态分布。
y = np.random.randn(N)

plt.scatter(x,y)
plt.show()#如果不使用plo.show()图表是显示不出来的,因为可能你要对图表进行多种的描述,所以通过显式的调用show()可以避免不必要的错误。
#scatter的函数签名如下:
#scatter(x,y,s)=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,hold=None,data=None,**kwargs
#x,y:形如shape (n,)的数组 #表示的是大小为(n,)的数组,也就是我们即将绘制散点图的数据点
#s:点的大小,默认20,参数可选
#c:点的取色序列,默认蓝色‘b’,但是c不可以是一个单独的RGB数字,也不可以是一个RGBA的序列。可以是他们的2维数组(只有一行)
#marker:点的形状,默认是圆
#cmap:Colormap实体或者是一个colormap的名字
#norm:Normalize实体来将数据亮度转化到0-1之间,如果没有申明,就是默认为colors.Normalize。
#vmin,vmax:实数,当norm存在的时候忽略。用来进行亮度数据的归一化。
#alpha:点的透明度, 实数,0-1之间
#linewidths:也就是标记点的长度。
#edgecolors:边缘颜色

运行结果:

plt.scatter(x,y,c='rykgm',s=100,marker='>')#这里运行报错,应该是c的RGB或者RGBA问题,后续查资料修正
plt.show()

运行结果:(出错,后续查询改正)

plt.scatter(x,y,alpha=0.5)
plt.show()

运行结果:

plt.scatter(x,y,edgecolors='r')
plt.show()

柱状图:bar

data = [5, 20, 15, 25, 10]
plt.bar(range(len(data)),data)#len()返回字符串、列表、字典、元组等长度,range()函数它能返回一系列连续增加的整数
plt.show()
#bar的函数签名:
#bar(left, height, width=0.8, bottom=None,  **kwargs)
#left,height,width,bottom这四个参数确定了柱体的位置和大小,具体定位:
#(left-width/2,bottom)为左下角位置
#(left+width/2,bottom+height)为右上角位置

运行结果:

plt.bar([0.3,1.7,4,6,7], data, width=0.6, bottom=[10,0,5,0,5])
plt.show()

运行结果:

#对于柱状图,还可以设置以下参数:
#颜色: color
#描边: 边缘颜色:edgecolor(ec);边缘样式:linestyle(ls);边缘粗细:linewidth(lw)
#填充: hatch: 可取值为: /,\,|,-,+,×,o,O,.,*
#位置标志: tick_label
labels = ['Tom', 'Dick', 'Harry', 'Slim', 'Jim']
plt.bar(range(len(data)), data, color='rgb', ec='r', ls='--', lw=2, hatch='o', tick_label=labels)#rgb:颜色 比如white:整数值(255,255,255),小数值(1,1,1)
plt.show()

运行结果:

#堆叠柱状图
#通过bottom参数,可以轻松实现堆叠柱状图
size = 5
x = np.arange(size)
a = np.random.random(size)#random() 方法返回随机生成的一个实数,它在[0,1)范围内。
b = np.random.random(size)
plt.bar(x, a, label='a')
plt.bar(x, b, bottom=a, label='b')
plt.legend()#plt.legend()函数主要的作用就是给图加上图例,plt.legend([x,y,z])里面的参数使用的是list的的形式将图表的的名称喂给这和函数。
plt.show()

运行结果:

补充上面代码出现的legend()函数:
文章参考链接:https://www.cnblogs.com/czz0508/p/10451944.html

#补充:legend()函数,函数功能:表示不同图形的文本标签图案。调用签名:plt.legend(loc="lower left")。loc:图例在图中的地理位置。
#legend()函数代码实现:(左下角,plot figure)文章参考链接:https://www.cnblogs.com/czz0508/p/10451944.html
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0.05, 10, 1000)
y = np.sin(x)

plt.plot(x, y, ls="-.", lw=2, c="c", label="plot figure")
plt.legend(loc="lower left")
plt.show()

运行结果:

#并列柱状图
#并列柱状图需要通过left属性添加偏移量来实现
size = 5
x = np.arange(size)
a = np.random.random(size)#random()random模块用于生成随机数,里面有许多函数用法https://blog.csdn.net/kancy110/article/details/69665164/
b = np.random.random(size)
total_width, n = 0.8, 2
width = total_width / n #宽=总长度/2
x = x - (total_width - width) / 2
plt.bar(x, a, width=width, label = 'a')
plt.bar(x + width, b, width=width, label = 'b')
plt.legend()
plt.show()

运行结果:

补充:Python 中的range,以及numpy包中的arange函数
链接:https://blog.csdn.net/qianwenhong/article/details/41414809

#补充:Python 中的range,以及numpy包中的arange函数
#链接:https://blog.csdn.net/qianwenhong/article/details/41414809
#range()函数:
#函数说明: range(start, stop[, step]) -> range object,根据start与stop指定的范围以及step设定的步长,生成一个序列。
#参数含义:start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5);
#        end:技术到end结束,但不包括end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
#        scan:每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
#        函数返回的是一个range object
#代码实例:
#>>> range(0,5) 			 	#生成一个range object,而不是[0,1,2,3,4]
#range(0, 5)
#>>> c = [i for i in range(0,5)] 	 #从0 开始到4,不包括5,默认的间隔为1
#>>> c
#[0, 1, 2, 3, 4]
#>>> c = [i for i in range(0,5,2)] 	 #间隔设为2
#>>> c
#[0, 2, 4]
#若需要生成[ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9]
#>>> range(0,1,0.1)    #range中的setp 不能使float
#Traceback (most recent call last):
#  File "<pyshell#5>", line 1, in <module>
#range(0,1,0.1)
#TypeError: 'float' object cannot be interpreted as an integer
#arrange()函数:
#函数说明:arange([start,] stop[, step,], dtype=None)根据start与stop指定的范围以及step设定的步长,生成一个 ndarray。 dtype : dtype
#        The type of the output array.  If `dtype` is not given, infer the data
#        type from the other input arguments.
#代码实例:
#  >>> np.arange(3)
#    array([0, 1, 2])
#    >>> np.arange(3.0)
#    array([ 0.,  1.,  2.])
#    >>> np.arange(3,7)
#   array([3, 4, 5, 6])
#   >>> np.arange(3,7,2)
#    array([3, 5])
#>>> arange(0,1,0.1)
#array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

条形图:barh

#条形图
#类似bar方法,仅换了方法名称:barh(bar-horizontal)
import matplotlib.pyplot as plt#Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
import pandas as pd# pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
import numpy as np#numpy是Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。data = [5, 20, 15, 25, 10]
plt.barh(range(len(data)), data)
plt.show
#barh的签名为
#barh(bottom,width,height=0.8, left = None, **kwargs)
#因此,使用时可以看成是bar的旋转,其方法完全一样

运行结果:

#正负条形图
#可以通过barh方法轻松获得
a = np.array([5, 20, 15, 25, 10])#array模块就是数组,可以存放放一组相同类型的数字
b = np.array([10, 15, 20, 15, 5])#Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组(在TensorFlow里面偏向于矩阵理解),也没有各种运算函数。因而不适合数值运算。NumPy的出现弥补了这些不足。
plt.barh(range(len(a)),a, label='a')
plt.barh(range(len(b)),-b, label='b')
plt.legend()
plt.show()

运行结果:

补充:python中数组(numpy.array)的基本操作
参考链接:https://blog.csdn.net/fu6543210/article/details/83240024

#为什么要用numpy:  Python中提供了list容器,可以当作数组使用。但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3]。就需要三个指针和三个整数对象。对于数值运算来说,这种结构显然不够高效。
#                 Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组(在TensorFlow里面偏向于矩阵理解),也没有各种运算函数。因而不适合数值运算。
#                 NumPy的出现弥补了这些不足。(——摘自张若愚的《Python科学计算》)
import numpy as np
#数组创建
##常规数组创建方法
a = np.array([2,3,4])
b = np.array([2.0,3.0,4.0])
c = np.array([[1.0,2.0],[3.0,4.0]])
d = np.array([[1,2],[3,4]],dtype=complex) # 指定数据类型
print (a, a.dtype)
print (b, b.dtype)
print (c, c.dtype)
print (d, d.dtype)

运行结果:

[2 3 4] int32
[2. 3. 4.] float64
[[1. 2.]
[3. 4.]] float64
[[1.+0.j 2.+0.j]
[3.+0.j 4.+0.j]] complex128

数组的常用函数:

#数组的常用函数
print (np.arange(0,7,1,dtype=np.int16)) # 0为起点,间隔为1时可缺省(引起歧义下不可缺省)
print (np.ones((2,3,4),dtype=np.int16)) # 2页,3行,4列,全1,指定数据类型
print (np.zeros((2,3,4))) # 2页,3行,4列,全0
print (np.empty((2,3))) #值取决于内存
print (np.arange(0,10,2)) # 起点为0,不超过10,步长为2
print (np.linspace(-1,2,5)) # 起点为-1,终点为2,取5个点
print (np.random.randint(0,3,(2,3))) # 大于等于0,小于3,2行3列的随机整数

运行结果:

[0 1 2 3 4 5 6]
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]

[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
[[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]

[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]]
[[1.39069238e-309 1.39069238e-309 1.39069238e-309]
[1.39069238e-309 1.39069238e-309 1.39069238e-309]]
[0 2 4 6 8]
[-1.   -0.25  0.5   1.25  2.  ]
[[2 2 2]
[1 2 2]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: