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/