更多优质内容
请关注公众号

Python数据分析基础(八) 使用Matplotlib实现数据可视化-张柏沛IT博客

正文内容

Python数据分析基础(八) 使用Matplotlib实现数据可视化

栏目:Python 系列:Python数据分析系列 发布时间:2019-12-12 14:56 浏览量:2703

Python数据可视化是将数据以图形或者表格的形式展示

这里会使用到matplotlib这个库

 

1.点图和线图
plt.plot(x,y,format_string,**kwargs)   #绘制点图或者线图

**kwargs 是第二组xy


plt.subplot(rows,columns,plotNum)  #生成子图
生成一个rows行columns列的绘图区,plotNum表示位于哪个绘图区,1<=plotNum<=rows*columns

subplot(1,2,1)  #也可以写成 subplot(121)

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

font = FontProperties(fname="./msyh.ttf")
# plt.rcParams['font.sans-serif']=['SimHei']
#生成X
x1 = np.linspace(0,5)  #生成50个点,间隔是均匀的
x2 = np.linspace(0,2)  #也是生成50个点

#生成Y
y1 = np.cos(2*np.pi*x1)*np.exp(-x1)
y2 = np.cos(2*np.pi*x2)

#生成第一个子图
plt.subplot(2,1,1)   #表示一共有两个子图,该子图位于第一行的第一列
#绘图
plt.plot(x1,y1,'yo-')

plt.title("绘制点线图",fontproperties=font)
plt.ylabel("阻尼振动图",fontproperties=font)

#绘制第二个图
plt.subplot(2,1,2)
plt.plot(x2,y2,"r.-")
plt.xlabel("时间(s)",fontproperties=font)
plt.ylabel("非阻尼",fontproperties=font)

plt.show()  #出图

使用matplotlib绘制点线图

 

在这里说一下,在matplotlib中显示中文的两种方法:
第一种:
plt.rcParams['font.sans-serif']=['SimHei']

第二种:
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="./msyh.ttf")    #msyh.tff是我在系统字体库中找到的微软雅黑字体,我将它拷贝了一份放到代码同级目录下。

之后,凡是显示中文的地方都要加上 fontproperties=font 这个参数:
plt.xlabel("时间(s)",fontproperties=font)
plt.ylabel("非阻尼",fontproperties=font)

 

2.直方图
n,bins,patches = hist(
    arr,
    bins=10,
    normed=0,
    facecolor="black",
    edgecolor="black",
    alpha=1,
    histtype="bar"
)

arr 直方图的一维数组x
bins 直方图柱数
density(前normed参数,现在改为density) 是否向量归一化,即求频率
facecolor 直方图填充色
edgecolor 直方图边框颜色
alpha 透明度
histtype 直方图类型:bar,barstacked,step,stepfilled

返回值
n 直方图向量(y值)
bins 返回各个bin的区间范围 (x值)
patches 返回每个bin里面的数据,是一个list

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.stats import norm

plt.rcParams['font.sans-serif']=['SimHei']

mu = 100 #分布的均值
sigma = 15 #分布的标准差
x= mu + sigma*np.random.randn(10000)   #randn生成具有正态分布的值
# print(x,x.shape)

#直方图条数
num_bins = 50

#绘图
n,bins,patches = plt.hist(x,num_bins,density=1,facecolor="green",edgecolor="black",alpha=0.5)

print(n)   #返回的y值
print(bins)   #返回的x值
print(patches)

#添加一个拟合曲线
y = norm.pdf(bins,mu,sigma) #返回数据的概率密度函数(高斯函数)

plt.plot(bins,y,"r--")
plt.title("均值为100,标准差为15的智商正态分布")
plt.ylabel("概率")
plt.xlabel("智商(IQ)")

#调整图像间距防止y轴和label重合
plt.subplots_adjust(left=0.15)
plt.show()

使用matplotlib绘制直方图

 

扩展:
np.random.randn(维度)
生成一个或一组具有标准正态分布的样本(x)

不传参则返回一个值
传入维度则返回相应维度的正态分布样本

np.random.randn(2)
#[0.27795239, -2.57882503]

np.random.randn(2,4)
#array([[ 0.27795239, -2.57882503,  0.3817649 ,  1.42367345],
        [-1.16724625, -0.22408299,  0.63006614, -0.41714538]])
返回一个 2*4 的矩阵

np.random.randn(4,3,2)
#返回一个三维数组

 

3.等值线图
将三维的图像在二维的空间以等值线和数值表示物体的形状

contour() 将三维图像在二维空间表示
clabel()  在每条线上显示数据值的大小

import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

plt.rcParams['font.sans-serif']=['SimHei']

#生成数据
delta = 0.2
x = np.arange(-3,3,delta)
y = np.arange(-3,3,delta)

print(x)

X,Y = np.meshgrid(x,y)   #生成坐标矩阵0,X是一个30*30的二维数组
# print(X)
Z = X**2 + Y**2

# print(Z)

x = X.flatten() #将二维数组展开为一维数组
print(x)

y = Y.flatten()
z = Z.flatten()

fig = plt.figure(figsize=(12,6))   #生成一个画布
ax1 = fig.add_subplot(121,projection="3d")
ax1.plot_trisurf(x,y,z,cmap=cm.jet,linewidth=0.01)  #cmap指颜色,jet是蓝青黄红的渐变色
plt.title("3D")

ax2 = fig.add_subplot(122)
cs = ax2.contour(X,Y,Z,15,camp="jet")  #15是等高线密集程度,数值越大,画的等高线越多

ax2.clabel(cs,inline=True,fontsize=10,fmt="%1.1f")
plt.title("Contour")
plt.show()

使用matplotlib绘制等值线

 

4.三维曲面图

plot_surface()

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm

fig = plt.figure(figsize=(8,6))

#只有引入了axes3d才能使用projection="3d"这个参数
ax = fig.gca(projection="3d") #当前的图表和子图可以使用plt.gcf()和plt.gca()获得,分别表示Get Current Figure和Get Current Axes。在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,比如说:plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。

#生成测试数据
X,Y,Z = axes3d.get_test_data(0.05)
ax.plot_surface(X,Y,Z,alpha=0.8)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
# ax.set_xlim(-40,40)
# ax.set_ylim(-40,40)
# ax.set_zlim(-100,100)
plt.show()

使用matplotlib绘制3d图


PS:matplotlib的函数的参数很多,可以用help()查看,例如 hepl(plt.plot())

 

5.条形图
bar()

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif']=['SimHei']

n_group=5 #组数
means_men = [20,35,34,20,25]  #平均分
std_men = [2,3,4,1,2]  #标准差

means_women = [25,32,34,20,25]
std_women = [3,5,2,3,3]

#画图
fig,ax = plt.subplots()
index = np.arange(n_group)

bar_width=0.35  #条的长度
opacity=0.4
error_config = {'ecolor':'0.3'}


#条形图,第一参是条柱的位置,第二参是数据,第三参柱子宽度
rects1 = plt.bar(index,means_men,bar_width,alpha=opacity,color='b',yerr=std_men,error_kw=error_config,label='男生')
rects2 = plt.bar(index+bar_width,means_women,bar_width,alpha=opacity,color='r',yerr=std_women,error_kw=error_config,label='女生')

plt.xlabel("班级")
plt.ylabel("平均分")
plt.title("分数分组条形图")
plt.xticks(index+bar_width/2,("A","B","C","D","E"))   #第二参是横坐标的标示,第一参是标示所在的位置
plt.legend()   #显示标注,即右上角的标示那哪个条条是男生,哪个条条是女生

plt.tight_layout()  #自动调整位置
plt.show()

使用matplotlib绘制条形图

 

 

7.饼图
pie()

指定颜色,分类,数值

import matplotlib.pyplot as plt

labels = list("ABCD")
sizes = [15,30,45,10]
colors = ["yellowgreen","gold","lightblue","lightcoral"]

explode=(0,0.1,0,0)    #表示第二块从圆中分离出来

#autopct表示auto percent 格式化百分比
plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=90)

plt.axis("equal")
plt.show()

使用matplotlib绘制饼图

 

8.散点图之气泡图
scatter()

气泡图是散点图的一种变体,通过每个点的面积反映第三维数据

import matplotlib.pyplot as plt
import pandas as pd
import random

plt.rcParams['font.sans-serif']=['SimHei']
df1=pd.read_csv("../material/iris.csv")

print(df1)  # 列名为 SepalLength  SepalWidth  PetalLength  PetalWidth   Name

def getRandomColor():
    colorNum = list("0123456789ABCDEF")
    colorNums = "".join([random.sample(colorNum,1)[0] for i in range(6)])

    return "#"+colorNums

fig,ax = plt.subplots()

colors = [getRandomColor() for i in range(len(df1))]   #生成的颜色个数要和x,y的个数相同

#设置speallength为x spealwidth为y petallength为z(即气泡大小)
#sepal 萼片  petal 花瓣
ax.scatter(df1['SepalLength'],df1['SepalWidth'],s=df1['PetalLength']*100,color=colors,alpha=0.6)
ax.set_xlabel("萼片长度(厘米)")
ax.set_ylabel("萼片宽度(厘米)")
ax.set_title("花瓣长度(厘米)")

ax.grid(True)   #使用网格
fig.tight_layout()
plt.show()

使用matplotlib绘制散点图

 

 

PS:plt.subplots()是一个函数,返回一个包含figure和axes对象的元组。
通常,我们只用到ax

fig,ax = plt.subplots(nrows=2, ncols=2)
axes = ax.flatten()
把父图分成2*2个子图,ax.flatten()把子图展开赋值给axes,axes[0]便是第一个子图,axes[1]是第二个... ...

ax拥有plt的所有画图方法,如plot,scatter,pie,bar,...

如果,你想改变图形的属性或想把图形保存为.npg文件,那么fig是非常有用的。
fig.savefig("name.npg")

使用figure()
fig = plt.figure()
ax = fig.add_subplot(121)
ax.hist()  #直方图就绘制在了1*2中的第一个子图上。
ax2 = fig.add_subplot(122)
ax2.pie()   #饼图画在第二个子图

fig.add_subplot(121)和fig.add_subplot(1,2,1)是可互换的。表示把父图分成1行2列,图形绘制在第一个子图上。


无论是否使用子图,还是用ax画图,显示的时候都是plt.show(),而不会是ax.show()

fig是画布的操作,ax是对图像的操作

 

 

更多关于matplotlib的使用请看官方文档

https://www.matplotlib.org.cn/




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > Python数据分析基础(八) 使用Matplotlib实现数据可视化

热门推荐
推荐新闻