点击查看Matplotlib官方文档
7.Python对数据的可视化处理
7.1 工具 Jupyter Notebook
%matplotlib inline
#在 jupyter 中嵌入显示,图片内嵌,而不是弹出。缺陷:除非代码一次执行,不然无法叠加绘图
%config InlineBackend.figure_format = "retina" #呈现分辨率较高的图像
常用来制作数据可视化的图形库是ggplot,直接pip3 install 即可,因为被放弃了这个库,所以这里跳过
7.2 matplotlib
1.点图和线图(key:二维数据,plot(),subplot()绘制多个子图)
# -*- coding: UTF-8 -*-
'''
@Author :Jason
plt 画点图 和 线图
plot参数说明 (x,y,format_string)
x: x轴,列表或者数组
y: y轴,列表或者数组
format_string: 控制曲线的格式字符串,可选
'''
import numpy as np
import matplotlib.pyplot as plt
#x轴
x1 = np.linspace(0.0,5.0)
x2 = np.linspace(0.0,2.0)
#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("xy")
plt.ylabel("y")
#绘图二
plt.subplot(2,1,2)
plt.plot(x2,y2,'r.-')
plt.xlabel("time(s)")
plt.ylabel("Undamped")
plt.show()
图形:
2.直方图(histogram) 二维统计表
# -*- coding: UTF-8 -*-
'''
@Author :Jason
直方图
hist函数命令格式如下
n,bins,pathes = plt.hist(
arr, #以为数组 x
bins, #直方图的柱数 默认为10
normed = 0, #是否向量归一化,默认0
facecolor = "black", #直方图颜色
edgecolor = "black", #直方图边框颜色
alpha = 1, #透明度
histtype = "bar", #直方图类型 bar,barstacked,step,stepfilled
)
返回值:
n : 直方图向量,是否归一化由参数 normed 决定
bins : 返回各个bin的区间范围
patches : 返回每个bin里面包含的数据,是一个list
'''
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
mu = 100 #均值
sigma = 15 #标准差
x = mu + sigma * np.random.randn(10000)
print("x:",x.shape)
#直方图条数
num_bins = 50
#绘图
n, bins, patches = plt.hist(x, num_bins,normed=1,facecolor = "red",alpha = 0.5)
#添加一个最佳拟合曲线
y = mlab.normpdf(bins,mu,sigma) #返回关于数 据的pdf数值(概率密度函数)
plt.plot(bins,y,"r--")
plt.xlabel("Smarts")
plt.ylabel("Probability")
#在图中添加公示用latex的语法($ $)
plt.title("Histogram of IQ:$\mu = 100$,$\sigma=15$")
#调整图像的间距,防止y轴数值与 label重合
plt.subplots_adjust(left=0.15)
plt.show()
print("bind:\n",bins)
图形:
3.等直线图 <===> 等量线图
# -*- coding: UTF-8 -*-
'''
@Author :Jason
等量线图(等直线图),地理中的等高线图
连续分部且逐渐变化的数量特征
contour()函数将三维图像在二维空间上表示,并且使用clabel()在每条线上显示数据值的大小
'''
import numpy as np
from matplotlib import cm
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#生成数据
delta = 0.2
x = np.arange(-3,3,delta)
y = np.arange(-3,3,delta)
X, Y = np.meshgrid(x,y)
Z = X**2 + Y**2
x = X.flatten()#返回一维数组,但该函数只能适用于numpy对象(array 或者 mat)
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指颜色,默认绘制为RGB(A)颜色空间,jet表示"蓝青黄红"颜色
plt.title("3D")
ax2 = fig.add_subplot(122)
cs = ax2.contour(X,Y,Z,15,cmap="jet",)
#X,Y,Z,15代表的是显示等高线的密集程度,数值越大,画的等高线数就越多
ax2.clabel(cs,inline=True,fontsize = 10,fmt='%1.1f')
plt.title("Contour")
plt.show()
图形:
4.三维曲面图
# -*- coding: UTF-8 -*-
'''
@Author :Jason
三维曲面图
'''
from mpl_toolkits.mplot3d import axes3d
from matplotlib import pyplot as plt
from matplotlib import cm
fig = plt.figure(figsize=(8,6))
ax = fig.gca(projection="3d")
#三维数据
X,Y,Z = axes3d.get_test_data(0.05)
ax.plot_surface(X,Y,Z,rstride=8,cstride=8,alpha=0.3)
cset = ax.contour(X,Y,Z,zdir="z",offset=-100,cmap=cm.coolwarm)
cset = ax.contour(X,Y,Z,zdir="x",offset=-40,cmap=cm.coolwarm)
cset = ax.contour(X,Y,Z,zdir="y",offset=-40,cmap=cm.coolwarm)
ax.set_xlabel("X")
ax.set_xlim(-40,40)
ax.set_ylabel("Y")
ax.set_ylim(-40,40)
ax.set_zlabel("Z")
ax.set_zlim(-100,100)
plt.show()
图形:
5.条形图
# -*- coding: UTF-8 -*-
'''
@Author :Jason
条形图
'''
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import numpy as np
from matplotlib import pyplot as plt
#组数
n_group = 5
#平均值 和 标准差
means_men = (20,35,30,35,27)
std_men = (2,3,4,1,2)
means_women = (25,32,34,30,35)
std_women = (3,4,2,3,3)
#画图
fig ,ax = plt.subplots()
index = np.arange(n_group)
bar_width = 0.35 #宽度
opacity = 0.4
error_config = {"ecolor":"0.3"}
#条形图中的第一条类
rectsl = 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("Group")
plt.ylabel("Scores")
plt.title("男女各组间得分情况")
plt.xticks(index + bar_width,("A","B","C","D","E"))
plt.legend()
#自动调整subplot()的参数给指定的填充区
plt.tight_layout()
plt.show()
图形:
6.饼图
# -*- coding: UTF-8 -*-
'''
@Author :Jason
饼图
pie(x, #百分比数据
explode, #是否提取出来
labels, #描述
colors, #需要呈现的颜色
startangle, #饼图开始的位置
)
'''
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
from matplotlib import pyplot as plt
lables = "语文","数学","英语","化学"
sizes = [123,434,904,232] #类似百分比
colors = ["green","red","gold","blue"] #颜色
#0.1 代表从饼图中分割出来
explode = (0,0.1,0,0)
#画图
plt.pie(sizes,explode=explode,labels=lables,colors=colors,autopct="%1.1f",shadow=True,startangle=90)
plt.axis("equal")
plt.show()
图形:
7.气泡图(散点图)
# -*- coding: UTF-8 -*-
'''
@Author :Jason
散点图 ==> 气泡图
scatter(x, #x方向数据
y, #y方向数据
s, #气泡大小
color, #气泡颜色,一定要和x轴数据个数对应
alpha, #透明度
)
'''
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
from matplotlib import pyplot as plt
import pandas as pd
#导入数据
# df_data = pd.read_csv("https://raw.githubusercontent.com/pydata/pandas/master/pandas/tests/data/iris.csv")
df_data = pd.read_csv("./files/scatter.csv")
# df_data.to_csv("./files/scatter.csv",encoding='utf-8-sig',index=None)
df_data.head()
#画图
fig, ax = plt.subplots()
#设置气泡颜色
colors = ["#7CFC00","#473C8B","#8B1A1A","#C0FF3E","#C67171","#FFD700","#BBFFFF",
"#8B5A00","#5C5C5C","#66CD00","#242424","#1E90FF","#8B1A1A","#C0FF3E","#C67171"]
#SepalLength为x,SepalWidth为y,PetalLength*100为气泡大小,颜色,透明度
ax.scatter(df_data["SepalLength"],df_data["SepalWidth"],s=df_data["PetalLength"]*100,
color=colors*10,alpha=0.6)
ax.set_xlabel("SeplLength(厘米)")
ax.set_ylabel("SepalWidth(厘米)")
ax.set_title("PetalLength(cm)*100")
#显示网格
ax.grid(True)
fig.tight_layout()
plt.show()
图形:
参照:《基于Python的大数据分析基础及实战》