数据的直观分析旨在通过视觉化的方式,帮助人们更直观、更快速地理解数据的特征和模式,从而发现趋势、异常值、分布情况以及变量之间的关系,为决策提供支持。
数据可视化与信息图形、信息可视化、科学可视化及统计图形密切相关。
可视化的终极目标是洞悉蕴含在数据中的现象和规律,这里面有多重含义:发现、决策、解释、分析、探索和学习。
5.1 特殊统计图的绘制
#基本设置
import numpy as np #加载numpy包,数据分析、科学计算
np.set_printoptions(precision=4) #设置numpy输出为4位有效数
%config InlineBackedn.figure_format = 'retina' # 提高图形显示的清晰度
5.1.1 函数图
(1)初等函数图
from math import pi #调用math中的圆周率参数
x=np.linspace(0, 2*pi, 60) #生成[0,2*pi]上60个等差数列
x
from numpy import sin,cos,log,exp #调用numpy中的初等函数
import matplotlib.pyplot as plt #加载matplotlib包的绘图函数
plt.plot(x,sin(x)) #正弦函数 y=sin(x)
plt.plot(x, sin(x), 'ro--', linewidth=1, markersize=3)
plt.plot(x, cos(x), 'ro--', linewidth=1, markersize=3) #余弦函数 y=cos(x)
#对数函数 y=log(x+1)
plt.plot(x, log(x+1), 'ro--', linewidth=1, markersize=3)
#指数函数 y=exp(x)
plt.plot(x, exp(x), 'ro--', linewidth=1, markersize=3)
(2)椭圆函数图
t=np.linspace(0,2*pi, 50)
x=2*sin(t)
y=3*cos(t)
t
t=np.linspace(0,2*pi, 60)
x=2*sin(t)
y=3*cos(t)
t
from IPython.display import display, Math
formula = r'$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$'
display(Math(formula))
x = a sint
y = b cost
a = 2
b = 3
plt.plot(x,y,c='r')
plt.axvline(x=0)
plt.axhline(y=0)
plt.text(0.2,1,r'$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$',fontsize=25)
5.1.2 气泡图
x=np.linspace(-4,4,20)
print(x)
y=x**2 # y=x^2 抛物线
plt.scatter(x,y) #二维散点图
plt.scatter(x,y,s=100*y) #二维气泡图,s=8y
5.1.3 三维散点图
%matplotlib inline
X, Y = np.meshgrid(x, x) #从坐标向量x,y中返回坐标矩阵
Z = np.sin(np.sqrt(X**2 + Y**2)) #Z=sin(sqrt(X^2+Y^2))
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
Axes3D(fig).scatter(X, Y, Z)
# 创建数据
x = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, x) # 从坐标向量x,y中返回坐标矩阵
Z = np.sin(np.sqrt(X**2 + Y**2)) # Z=sin(sqrt(X^2+Y^2))
# 创建图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_axes(Axes3D(fig, elev=30, azim=20)) # 使用add_axes方法创建3D坐标轴
ax.scatter(X, Y, Z, c=Z, cmap='viridis', s=30, alpha=0.6) # 添加颜色映射和透明度
# 设置标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5, 5, 100) # 创建x坐标点
X, Y = np.meshgrid(x, x) # 从坐标向量x,y中返回坐标矩阵
Z = np.sin(np.sqrt(X**2 + Y**2)) # Z=sin(sqrt(X^2+Y^2))
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, Z, c=Z, cmap='viridis')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.title('3D Scatter Plot')
plt.show()
5.1.4 三维曲面图
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
Axes3D(fig).plot_surface(X, Y, Z)
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建数据
x = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, x)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 创建图形并绘制
fig = plt.figure(figsize=(10, 8))
ax = fig.add_axes(Axes3D(fig, elev=30, azim=20))
ax.plot_surface(X, Y, Z)
plt.show()
5.2 Seaborn 统计绘图
seaborn: statistical data visualization — seaborn 0.13.2 documentation
!pip show seaborn
!pip install seaborn
import seaborn as sns #加载seaborn包
5.2.1 seaborn绘图特点(见网站)
5.2.2 seaborn中的统计图
#(1)读取绘图用数据方法一
import pandas as pd
BSdata=pd.read_excel('./data/DaPy_data.xlsx','BSdata')
BSdata.head()
#(1)读取绘图用数据方法二
import pandas as pd
BSdata=pd.read_excel('DaPy_data.xlsx','BSdata')
BSdata.head()
#(2)中文字体段时需设置字体
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #设置中文字体为'黑体'
plt.rcParams['axes.unicode_minus'] = False # 这行解决负号显示问题
5.2.2.1 箱线图(boxplot)
sns.boxplot(x=BSdata['身高'])
sns.boxplot(y=BSdata['身高']) #竖着放的箱线图,也就是将x换成y
# 分组绘制箱线图,分组因子是“性别”,在x轴不同位置绘制。
sns.boxplot(x='性别',y='身高',data=BSdata)
5.2.2.2 小提琴图(violinplot)
sns.violinplot(x='开设', y='支出', hue='性别', data=BSdata)
5.2.2.3 点图(stripplot,航线图)
sns.stripplot(x='性别', y='身高', data=BSdata, jitter=True)
sns.stripplot(x='性别', y='身高', data=BSdata, jitter=False)
5.2.2.4 条图(barplot)
sns.barplot(x='性别', y='身高', data=BSdata) #不同性别身高均值标准差图
5.2.2.5 计数图(countplot)
sns.countplot(x='开设', hue="课程", data=BSdata)
5.2.2.6 分组关系图(factorplot)
sns.catplot(x='性别', col="开设", col_wrap=1, data=BSdata, kind="count", height=2, aspect=1.5)
5.2.2.7 概率分布图(distplot)
BSdata['身高'].hist()
BSdata.体重.hist()
sns.distplot(BSdata['身高'], kde=True, bins=10)
sns.distplot(BSdata['身高'],kde=False, bins=10)
#针对双变量,可使用Seaborn中的jointplot()函数。
sns.jointplot(x='身高', y='体重', data=BSdata)
sns.jointplot(x='体重', y='支出', data=BSdata)
sns.pairplot(BSdata[['身高','体重','支出']]) #配对散点图
5.3 ggplot 绘图系统
5.3.1 ggplot与plotnine包
5.3.1.1 包的安装
!pip show ggplot
!pip show plotnine
# !pip install ggplot #在系统上安装ggplot包
# !pip install plotnine #在系统上安装plotnine包,与R的ggplot2相对应
5.3.1.2 包的加载与设置
from plotnine import * #加载和调用ggplot所有方法
theme_set(theme_bw(base_family='SimHei'))
#设置图形主题背景为白色bw、中文字体为黑体SimHei
5.3.2 ggplot 基本绘图
5.3.2.1 基本定义
5.3.2.2 ggplot中的图层
GP=ggplot(BSdata,aes(x='身高',y='体重')) #绘制直角坐标系
GP
GP + geom_point() #增加点图
GP + geom_line() #增加线图
GP + geom_point() + geom_line() #增加点和线图
5.3.3 常见统计图绘制
5.3.3.1 直方图
ggplot(BSdata,aes(x='身高')) + geom_histogram()
5.3.3.2 分组散点图
ggplot(BSdata,aes(x='身高',y='体重',shape='性别')) + geom_point()
ggplot(BSdata,aes(x='身高',y='体重',color='性别')) + geom_point()
ggplot(BSdata,aes(x='身高',y='体重',color='性别',shape='性别')) + geom_point()
ggplot(BSdata,aes(x='支出',y='身高',color='性别',shape='性别')) + geom_line() + geom_point()
#共用一个坐标,绘制不同的y值
ggplot(BSdata,aes(x='支出'))+geom_line(aes(y='身高')) + geom_line(aes(y='体重'))
ggplot(BSdata,aes(x='支出', y='身高'))+geom_line(aes( y='体重'))
5.3.3.4 分面图
#在plotnine中可使用facet_wrap参数可以按类型绘制分面图。
ggplot(BSdata,aes('身高','体重')) + geom_point() + facet_wrap('性别',nrow=2)
ggplot(BSdata,aes('身高','体重')) + geom_point() + facet_wrap('性别',nrow=1)
ggplot(BSdata,aes('身高','体重')) + geom_line() + geom_point() + facet_wrap('开设',nrow=3)
(ggplot(BSdata,aes('身高','体重')) + geom_point() + facet_wrap('~性别+开设',nrow=3))
(ggplot(BSdata,aes('身高','体重')) + geom_point() + facet_wrap('性别+开设',nrow=3))
5.4 pyecharts动态绘图
pyecharts - A Python Echarts Plotting Library built with love.
pyecharts简介
pyecharts是基于Echarts图表的一个类库,而Echarts是百度开源的商业级数据图表,它是一个纯JavaScript的图表库,可以为用户提供直观生动、可交互、可高度个性化定制的数据可视化图表,赋予了用户对数据进行挖掘整合的能力。
pyecharts主要基于web浏览器进行显示,绘制的图形比较多,包括折线图、柱状图、饼图、漏斗图、地图、极坐标图等,代码量很少,而且很灵活,绘制出来的图形很美观。
使用pyecharts时,需要安装相应的库,安装命令为:
pip install pyecharts
A Python Echarts Plotting Library——pyecharts - A Python Echarts Plotting Library built with love.