高维数据可视化示例

article/2025/10/1 1:04:43

高维数据可视化示例

文中代码均在Jupyter Notebook中运行
文中所需两个数据文件在下面给出。
文中数据集下载1
文中数据集下载2

目录

  • 高维数据可视化示例
  • 单变量分析
  • 多变量分析
    • 可视化二维数据
    • 可视化三维数据
    • 可视化四维数据
    • 可视化 5 维数据
    • 可视化 6 维数据(6-D)
  • 结论

import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
import numpy as np
import seaborn as sns
%matplotlib inline
white_wine = pd.read_csv("C:/Users/lenovo/Desktop/winequality-white.csv",sep=';')
red_wine = pd.read_csv("C:/Users/lenovo/Desktop/winequality-red.csv",sep=';')
red_wine
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
07.40.7000.001.90.07611.034.00.997803.510.569.45
17.80.8800.002.60.09825.067.00.996803.200.689.85
27.80.7600.042.30.09215.054.00.997003.260.659.85
311.20.2800.561.90.07517.060.00.998003.160.589.86
47.40.7000.001.90.07611.034.00.997803.510.569.45
.......................................
15946.20.6000.082.00.09032.044.00.994903.450.5810.55
15955.90.5500.102.20.06239.051.00.995123.520.7611.26
15966.30.5100.132.30.07629.040.00.995743.420.7511.06
15975.90.6450.122.00.07532.044.00.995473.570.7110.25
15986.00.3100.473.60.06718.042.00.995493.390.6611.06

1599 rows × 12 columns

#为两个表分别添加新的列标签,作为酒的类型
red_wine["wine_type"]="red"
white_wine['wine_type']="white"
#将数据标签数值改为文字性描述,增加了一个列标签quality_label进行描述
red_wine["quality_label"]=red_wine["quality"].apply(lambda value:"low"if value<=5 else "medium"if value <=7 else "high")
red_wine["quality_label"]=pd.Categorical(red_wine["quality_label"],categories=["low","medium","high"])white_wine["quality_label"]=white_wine["quality"].apply(lambda value:"low"if value<=5 else "medium"if value <=7 else "high")
white_wine["quality_label"]=pd.Categorical(white_wine["quality_label"],categories=["low","medium","high"])
#将两个表进行上下合并
wines=pd.concat([red_wine,white_wine])
wines
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholqualitywine_typequality_label
07.40.700.001.90.07611.034.00.997803.510.569.45redlow
17.80.880.002.60.09825.067.00.996803.200.689.85redlow
27.80.760.042.30.09215.054.00.997003.260.659.85redlow
311.20.280.561.90.07517.060.00.998003.160.589.86redmedium
47.40.700.001.90.07611.034.00.997803.510.569.45redlow
.............................................
48936.20.210.291.60.03924.092.00.991143.270.5011.26whitemedium
48946.60.320.368.00.04757.0168.00.994903.150.469.65whitelow
48956.50.240.191.20.04130.0111.00.992542.990.469.46whitemedium
48965.50.290.301.10.02220.0110.00.988693.340.3812.87whitemedium
48976.00.210.380.80.02022.098.00.989413.260.3211.86whitemedium

6497 rows × 14 columns

#打乱顺序,增加随机性
wines = wines.sample(frac=1,random_state=42).reset_index(drop=True)
wines.head()
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholqualitywine_typequality_label
07.00.170.7412.80.04524.0126.00.994203.260.3812.28whitehigh
17.70.640.212.20.07732.0133.00.995603.270.459.95redlow
26.80.390.347.40.02038.0133.00.992123.180.4412.07whitemedium
36.30.280.4711.20.04061.0183.00.995923.120.519.56whitemedium
47.40.350.2013.90.05463.0229.00.998883.110.508.96whitemedium
#输出两种酒的统计数据指标
subset_attributes = ["residual sugar","total sulfur dioxide","sulphates","alcohol","volatile acidity","quality"]rs=round(red_wine[subset_attributes].describe(),2)
ws=round(white_wine[subset_attributes].describe(),2)pd.concat([rs,ws],axis=1,keys=["Red Wine Statistics","White Wine Statistics"])#横向合并
Red Wine StatisticsWhite Wine Statistics
residual sugartotal sulfur dioxidesulphatesalcoholvolatile acidityqualityresidual sugartotal sulfur dioxidesulphatesalcoholvolatile acidityquality
count1599.001599.001599.001599.001599.001599.004898.004898.004898.004898.004898.004898.00
mean2.5446.470.6610.420.535.646.39138.360.4910.510.285.88
std1.4132.900.171.070.180.815.0742.500.111.230.100.89
min0.906.000.338.400.123.000.609.000.228.000.083.00
25%1.9022.000.559.500.395.001.70108.000.419.500.215.00
50%2.2038.000.6210.200.526.005.20134.000.4710.400.266.00
75%2.6062.000.7311.100.646.009.90167.000.5511.400.326.00
max15.50289.002.0014.901.588.0065.80440.001.0814.201.109.00

单变量分析

单变量分析基本上是数据分析或可视化的最简单形式,因为只关心分析一个数据属性或变量并将其可视化

wines.hist(bins=15,color="steelblue",edgecolor="black",linewidth=1.0,xlabelsize=8,ylabelsize=8,grid=False)
plt.tight_layout(rect=(0,0,1.2,1.2))#调整各子图之间的间距

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wq3LHoh0-1629092888383)(output_8_0.png)]

fig=plt.figure(figsize=(6,4))
title=fig.suptitle("Sulphates Content in Wine",fontsize=14)
fig.subplots_adjust(top=0.85,wspace=0.3)#调整间距ax=fig.add_subplot(1,1,1)
ax.set_xlabel("Sulphates")
ax.set_ylabel("Frequency")
ax.text(1.2,800,r"$\mu$="+str(round(wines['sulphates'].mean(),2)),fontsize=12)#在途图中的指定位置
freq,bins,patches=ax.hist(wines["sulphates"],color="steelblue",bins=15,edgecolor="black",linewidth=1)#做出关于sulphates的直方图fig=plt.figure(figsize=(6,4))
title = fig.suptitle("Sulphates Content in Wine",fontsize=14)
fig.subplots_adjust(top=0.85,wspace=0.3)#调整间距ax1=fig.add_subplot(1,1,1)
ax1.set_xlabel("Sulphates")
ax1.set_ylabel("Frequency")
sns.kdeplot(wines["sulphates"],ax=ax1,shade=True,color="steelblue")#做出核密度图

在这里插入图片描述
在这里插入图片描述

可视化一个离散分类型数据属性稍有不同,条形图是(bar plot)最有效的方法之一。你也可以使用饼图(pie-chart),但一般来说要尽量避免,尤其是当不同类别的数量超过 3 个时

多变量分析

多元分析才是真正有意思并且有复杂性的领域。这里我们分析多个数据维度或属性(2 个或更多)。多变量分析不仅包括检查分布,还包括这些属性之间的潜在关系、模式和相关性。你也可以根据需要解决的问题,利用推断统计(inferential statistics)和假设检验,检查不同属性、群体等的统计显著性(significance)。

可视化二维数据

f,ax=plt.subplots(figsize=(10,6))
corr=wines.corr()
hm=sns.heatmap(round(corr,2),annot=True,ax=ax,cmap="coolwarm",fmt=".2f",linewidth=.05)
f.subplots_adjust(top=0.93)
t=f.suptitle("Wine Attribute Correlation Heatmap",fontsize=14)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A4DC87vN-1629092888390)(output_13_0.png)]

sns.pairplot(wines.iloc[:,[1,2,3]])
f.subplots_adjust(top=0.93)
f.suptitle("Wine Attribute Pairwise Plots",fontsize=14)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kbn9CcsF-1629092888391)(output_14_1.png)]

from pandas.plotting import parallel_coordinatesfig,axes = plt.subplots()
parallel_coordinates(wines.iloc[:,[7,3,6,0,12]],"wine_type",ax=axes)
plt.legend()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEKSKczm-1629092888393)(output_15_1.png)]

基本上,在如上所述的可视化中,点被表征为连接的线段。每条垂直线代表一个数据属性。所有属性中的一组完整的连接线段表征一个数据点。因此,趋于同一类的点将会更加接近。仅仅通过观察就可以清楚看到,与白葡萄酒相比,红葡萄酒的密度略高。与红葡萄酒相比,白葡萄酒的残糖和二氧化硫总量也较高,红葡萄酒的固定酸度高于白葡萄酒。查一下我们之前得到的统计表中的统计数据,看看能否验证这个假设!

让我们看看可视化两个连续型数值属性的方法。散点图和联合分布图(joint plot)是检查模式、关系以及属性分布的特别好的方法

#散点图描述硫酸盐与究竟含量的关系
plt.scatter(wines["sulphates"],wines["alcohol"],alpha=0.4,edgecolors='w')plt.xlabel("Sulphates")
plt.ylabel("Alcohol")
plt.title("Wine Sulphates - Alcohol Content",y=1.05)jp=sns.jointplot(x="sulphates",y="alcohol",data=wines,kind="reg",space=0,size=5,ratio=4)
#观察酒精含量与硫酸盐的联合分布图
#你可以查看联合分布图中的相关性、关系以及分布

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uodtyAXk-1629092888396)(output_18_2.png)]
如何可视化两个连续型数值属性?一种方法是为分类维度画单独的图(子图)或分面(facet)

#将两种类型的酒根据质量指标的频率进行作图,观察各种质量的酒的分布情况fig=plt.figure(figsize=(10,4))
title=fig.suptitle("Wine Type - Quality",fontsize=14)
fig.subplots_adjust(top=0.85,wspace=0.3)ax1=fig.add_subplot(1,2,1)
ax1.set_title("Red Wine")
ax1.set_xlabel("Quality")
ax1.set_ylabel("Frequency")rw_q=red_wine["quality"].value_counts()
rw_q=(list(rw_q.index),list(rw_q.values))
ax1.set_ylim([0,2500])ax1.tick_params(axis="both",which="major",labelsize=8.5)
bar1=ax1.bar(rw_q[0],rw_q[1],color="red",edgecolor="k",linewidth=1)ax2 = fig.add_subplot(1,2, 2)
ax2.set_title("White Wine")
ax2.set_xlabel("Quality")
ax2.set_ylabel("Frequency") 
ww_q = white_wine['quality'].value_counts()
ww_q = (list(ww_q.index), list(ww_q.values))
ax2.set_ylim([0, 2500])
ax2.tick_params(axis='both', which='major', labelsize=8.5)
bar2 = ax2.bar(ww_q[0], ww_q[1], color='c', edgecolor='k', linewidth=1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qo9P6i6q-1629092888397)(output_20_0.png)]
虽然这是一种可视化分类数据的好方法,但正如所见,利用matplotlib要编写大量的代码。另一个好方法是在单个图中为不同的属性画堆积条形图或多个条形图。可以很容易地利用seaborn做到

cp = sns.countplot(x="quality",hue="wine_type",data=wines,palette={"red":"r","white":"c"})

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gzIb0ZPt-1629092888397)(output_22_0.png)]

让我们看看可视化 2 维混合属性(大多数兼有数值和分类)。一种方法是使用分图\子图与直方图或核密度图。

#直方图分图
fig = plt.figure(figsize = (10,4))
title = fig.suptitle("Sulphates Content in Wine", fontsize=14)
fig.subplots_adjust(top=0.85, wspace=0.3)ax1 = fig.add_subplot(1,2,1)
ax1.set_title("Red Wine")
ax1.set_xlabel("Sulphates")
ax1.set_ylabel("Frequency") 
ax1.set_ylim([0, 1200])
ax1.text(1.2, 800, r'$\mu$='+str(round(red_wine['sulphates'].mean(),2)), fontsize=12)
r_freq, r_bins, r_patches = ax1.hist(red_wine['sulphates'], color='red', bins=15,edgecolor='black', linewidth=1)ax2 = fig.add_subplot(1,2,2)
ax2.set_title("White Wine")
ax2.set_xlabel("Sulphates")
ax2.set_ylabel("Frequency")
ax2.set_ylim([0, 1200])
ax2.text(0.8, 800, r'$\mu$='+str(round(white_wine['sulphates'].mean(),2)), fontsize=12)
w_freq, w_bins, w_patches = ax2.hist(white_wine['sulphates'], color='white', bins=15,edgecolor='black', linewidth=1)#核密度图分图
fig = plt.figure(figsize = (10, 4))
title = fig.suptitle("Sulphates Content in Wine", fontsize=14)
fig.subplots_adjust(top=0.85, wspace=0.3)#描述红酒的硫酸盐含量
ax1 = fig.add_subplot(1,2, 1)
ax1.set_title("Red Wine")
ax1.set_xlabel("Sulphates")
ax1.set_ylabel("Density") 
sns.kdeplot(red_wine['sulphates'], ax=ax1, shade=True, color='r')#描述白酒的硫酸盐含量
ax2 = fig.add_subplot(1,2, 2)
ax2.set_title("White Wine")
ax2.set_xlabel("Sulphates")
ax2.set_ylabel("Density") 
sns.kdeplot(white_wine['sulphates'], ax=ax2, shade=True, color='y')

在这里插入图片描述
在这里插入图片描述

fig = plt.figure(figsize=(6,4))
title = fig.suptitle("Sulphates Content in Wine",fontsize=14)
fig.subplots_adjust(top=0.85,wspace=0.3)
ax=fig.add_subplot(1,1,1)
ax.set_xlabel("Sulphates")
ax.set_ylabel("Frequency")g=sns.FacetGrid(wines,hue="wine_type",palette={"red":"r","white":"y"})
g.map(sns.distplot,"sulphates",kde=False,bins=15,ax=ax)
ax.legend(title="Wine Type")
plt.close()

在这里插入图片描述

可以看到上面生成的图形清晰简洁,我们可以轻松地比较各种分布。除此之外,箱线图(box plot)是根据分类属性中的不同数值有效描述数值数据组的另一种方法。箱线图是了解数据中四分位数值以及潜在异常值的好方法。

f,ax=plt.subplots(1,1,figsize=(12,4))
f.suptitle("Wine Quality - ALcohol Content",fontsize=14)sns.boxplot(x="quality",y="alcohol",data=wines,ax=ax)
ax.set_xlabel("Wine Quality",size=12,alpha=0.8)
ax.set_ylabel("Wine Alcohol %",size=12,alpha=0.8)

在这里插入图片描述

另一个类似的可视化是小提琴图,这是使用核密度图显示分组数值数据的另一种有效方法(描绘了数据在不同值下的概率密度)。

#描述酒的质量与硫酸盐含量的小提琴图f,ax=plt.subplots(1,1,figsize=(12,4))
f.suptitle("Wine Quality - Sulphates Content",fontsize=14)sns.violinplot(x="quality",y="sulphates",data=wines,ax=ax)
ax.set_xlabel("Wine Quality",size=12,alpha=0.8)
ax.set_ylabel("Wine Sulphates",size=12,alpha=0.8)

在这里插入图片描述

cols=["density","residual sugar","total sulfur dioxide","fixed acidity","wine_type"]
pp = sns.pairplot(wines[cols],hue="wine_type",size=1.8,aspect=1.8,palette={"red":"r","white":"c"},plot_kws=dict(edgecolor="k",linewidth=0.5))fig=pp.figfig.subplots_adjust(top=0.93,wspace=0.3)
t=fig.suptitle("Wine Attributes Pairwise Plots",fontsize=14)

在这里插入图片描述

可视化三维数据

fig=plt.figure(figsize=(8,6))
ax=fig.add_subplot(111,projection="3d")xs=wines["residual sugar"]
ys=wines["fixed acidity"]
zs=wines["alcohol"]
ax.scatter(xs,ys,zs,s=50,alpha=0.6,edgecolor="w")

在这里插入图片描述

我们还可以利用常规的 2 维坐标轴,并将尺寸大小的概念作为第 3 维(本质上是气泡图),其中点的尺寸大小表征第 3 维的数量。

plt.scatter(wines["fixed acidity"],wines["alcohol"],s=wines["residual sugar"]*25,alpha=0.4,edgecolor="w")
plt.xlabel("Fixed Acidity")
plt.ylabel("Alcohol")
plt.title("Wine Alcohol Content - Fixed Acidity - Residual Sugar",y=1.05)
#第三维以⭕大小进行对比

在这里插入图片描述

因此,你可以看到上面的图表不是一个传统的散点图,而是点(气泡)大小基于不同残糖量的的气泡图。当然,并不总像这种情况可以发现数据明确的模式,我们看到其它两个维度的大小也不同。

为了可视化 3 个离散型分类属性,我们可以使用常规的条形图,可以利用色调的概念以及分面或子图表征额外的第 3 个维度。seaborn 框架帮助我们最大程度地减少代码,并高效地绘图。

fc = sns.factorplot(x="quality",hue="wine_type",col="quality_label",data=wines,kind="count",palette={"red":"r","white":"c"})

在这里插入图片描述
上面的图表清楚地显示了与每个维度相关的频率,可以看到,通过图表能够容易有效地理解相关内容。

考虑到可视化 3 维混合属性,我们可以使用色调的概念来将其中一个分类属性可视化,同时使用传统的如散点图来可视化数值属性的 2 个维度。

#通过散点图和色调的概念进行三维数据的可视化
jp = sns.pairplot(wines,x_vars=["sulphates"],y_vars=["alcohol"],size=4.5,hue="wine_type",palette={"red":"r","white":"c"},plot_kws=dict(edgecolor="k",linewidth=0.5))lp=sns.lmplot(x="sulphates",y="alcohol",hue="wine_type",palette={"red":"r","white":"c"},data=wines,fit_reg=True,legend=True,scatter_kws=dict(edgecolor="k",linewidth=0.5))

在这里插入图片描述
在这里插入图片描述

因此,色调作为类别群体的良好区分,虽然如上图观察没有相关性或相关性非常弱,但从这些图中我们仍可以理解,与白葡萄酒相比,红葡萄酒的硫酸盐含量较高。你也可以使用核密度图代替散点图来理解 3 维数据。

ax = sns.kdeplot(white_wine["sulphates"],white_wine["alcohol"],cmap="YlOrBr", shade=True, shade_lowest=False)
ax = sns.kdeplot(red_wine["sulphates"],red_wine["alcohol"],cmap="Reds", shade=True, shade_lowest=False)

在这里插入图片描述
与预期一致且相当明显,红葡萄酒样品比白葡萄酒具有更高的硫酸盐含量。你还可以根据色调强度查看密度浓度。

如果我们正在处理有多个分类属性的 3 维数据,我们可以利用色调和其中一个常规轴进行可视化,并使用如箱线图或小提琴图来可视化不同的数据组。

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 4))
f.suptitle('Wine Type - Quality - Acidity', fontsize=14)sns.violinplot(x="quality", y="volatile acidity",data=wines, inner="quart", linewidth=1.3,ax=ax1)
ax1.set_xlabel("Wine Quality",size = 12,alpha=0.8)
ax1.set_ylabel("Wine Volatile Acidity",size = 12,alpha=0.8)sns.violinplot(x="quality", y="volatile acidity", hue="wine_type", data=wines, split=True, inner="quart", linewidth=1.3,palette={"red": "#FF9999", "white": "white"}, ax=ax2)
ax2.set_xlabel("Wine Quality",size = 12,alpha=0.8)
ax2.set_ylabel("Wine Volatile Acidity",size = 12,alpha=0.8)
l = plt.legend(loc='upper right', title='Wine Type')  

在这里插入图片描述

在上图中,我们可以看到,在右边的 3 维可视化图中,我们用 x 轴表示葡萄酒质量,wine_type 用色调表征。我们可以清楚地看到一些有趣的见解,例如与白葡萄酒相比红葡萄酒的挥发性酸度更高。

你也可以考虑使用箱线图来代表具有多个分类变量的混合属性。

f,(ax1,ax2)=plt.subplots(1,2,figsize=(14,4))
f.suptitle("Wine Type - Quality - Alcohol Content",fontsize=14)sns.boxplot(x="quality",y="alcohol",hue="wine_type",data=wines,palette={"red":"r","white":"c"},ax=ax1)
ax1.set_xlabel("Wine Quality",size=12,alpha=0.8)
ax1.set_ylabel("Wine Alcohol %",size=12,alpha=0.8)sns.boxplot(x="quality_label",y="alcohol",hue="wine_type",data=wines,palette={"red":"r","white":"c"},ax=ax2)
ax2.set_xlabel("Wine Quality",size=12,alpha=0.8)
ax2.set_ylabel("Wine Alcohol %",size=12,alpha=0.8)
l=plt.legend(loc="best",title="Wine Type")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J01kM7qj-1629092888408)(output_44_0.png)]
我们可以看到,对于质量和 quality_label 属性,葡萄酒酒精含量都会随着质量的提高而增加。另外红葡萄酒与相同品质类别的白葡萄酒相比具有更高的酒精含量(中位数)。然而,如果检查质量等级,我们可以看到,对于较低等级的葡萄酒(3 和 4),白葡萄酒酒精含量(中位数)大于红葡萄酒样品。否则,红葡萄酒与白葡萄酒相比似乎酒精含量(中位数)略高。

可视化四维数据

可视化 4 维数据的方法是在传统图如散点图中利用深度和色调表征特定的数据维度。

fig = plt.figure(figsize=(8, 6))
t = fig.suptitle('Wine Residual Sugar - Alcohol Content - Acidity - Type', fontsize=14)
ax = fig.add_subplot(111, projection='3d')xs = list(wines['residual sugar'])
ys = list(wines['alcohol'])
zs = list(wines['fixed acidity'])
data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]
colors = ['red' if wt == 'red' else 'yellow' for wt in list(wines['wine_type'])]for data, color in zip(data_points, colors):x, y, z = dataax.scatter(x, y, z, alpha=0.4,edgecolor="k",c=color,s=30)ax.set_xlabel('Residual Sugar')
ax.set_ylabel('Alcohol')
ax.set_zlabel('Fixed Acidity')

在这里插入图片描述

wine_type 属性由上图中的色调表征得相当明显。此外,由于图的复杂性,解释这些可视化开始变得困难,但我们仍然可以看出,例如红葡萄酒的固定酸度更高,白葡萄酒的残糖更高。当然,如果酒精和固定酸度之间有某种联系,我们可能会看到一个逐渐增加或减少的数据点趋势。

另一个策略是使用二维图,但利用色调和数据点大小作为数据维度。通常情况下,这将类似于气泡图等我们先前可视化的图表。

size = wines['residual sugar']*25
fill_colors = ['#FF9999' if wt=='red' else '#FFE888' for wt in list(wines['wine_type'])]
edge_colors = ['red' if wt=='red' else 'orange' for wt in list(wines['wine_type'])]plt.scatter(wines['fixed acidity'], wines['alcohol'], s=size, alpha=0.4, color=fill_colors, edgecolors=edge_colors)plt.xlabel('Fixed Acidity')
plt.ylabel('Alcohol')
plt.title('Wine Alcohol Content - Fixed Acidity - Residual Sugar - Type',y=1.05);

在这里插入图片描述

我们用色调代表 wine_type 和数据点大小代表残糖。我们确实看到了与前面图表中观察到的相似模式,白葡萄酒气泡尺寸更大表征了白葡萄酒的残糖值更高。

如果我们有多于两个分类属性表征,可在常规的散点图描述数值数据的基础上利用色调和分面来描述这些属性。我们来看几个实例。

g = sns.FacetGrid(wines,col="wine_type",hue="quality_label",col_order=["red","white"],hue_order=["low","medium","high"],aspect=1.2,size=3.5,palette=sns.light_palette("navy",4)[1:])
g.map(plt.scatter,"volatile acidity","alcohol",alpha=0.9,edgecolor='white', linewidth=0.5, s=100)
fig = g.fig
fig.subplots_adjust(top=0.8, wspace=0.3)
fig.suptitle('Wine Type - Alcohol - Quality - Acidity', fontsize=14)
l = g.add_legend(title='Wine Quality Class')

在这里插入图片描述

这种可视化的有效性使得我们可以轻松识别多种模式。白葡萄酒的挥发酸度较低,同时高品质葡萄酒具有较低的酸度。也基于白葡萄酒样本,高品质的葡萄酒有更高的酒精含量和低品质的葡萄酒有最低的酒精含量!

让我们借助一个类似实例,并建立一个 4 维数据的可视化。

g = sns.FacetGrid(wines, col="wine_type", hue='quality_label', col_order=['red', 'white'], hue_order=['low', 'medium', 'high'],aspect=1.2, size=3.5, palette=sns.light_palette('green', 4)[1:])
g.map(plt.scatter, "volatile acidity", "total sulfur dioxide", alpha=0.9, edgecolor='white', linewidth=0.5, s=100)
fig = g.fig 
fig.subplots_adjust(top=0.8, wspace=0.3)
fig.suptitle('Wine Type - Sulfur Dioxide - Acidity - Quality', fontsize=14)
l = g.add_legend(title='Wine Quality Class')

在这里插入图片描述

我们清楚地看到,高品质的葡萄酒有较低的二氧化硫含量,这是非常相关的,与葡萄酒成分的相关领域知识一致。我们也看到红葡萄酒的二氧化硫总量低于白葡萄酒。在几个数据点中,红葡萄酒的挥发性酸度水平较高。

可视化 5 维数据

我们照旧遵从上文提出的策略,要想可视化 5 维数据,我们要利用各种绘图组件。我们使用深度、色调、大小来表征其中的三个维度。其它两维仍为常规轴。因为我们还会用到大小这个概念,并借此画出一个三维气泡图。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
t = fig.suptitle('Wine Residual Sugar - Alcohol Content - Acidity - Total Sulfur Dioxide - Type', fontsize=14)xs = list(wines['residual sugar'])
ys = list(wines['alcohol'])
zs = list(wines['fixed acidity'])data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]sizes = list(wines['total sulfur dioxide'])
colors = ['red' if wt == 'red' else 'yellow' for wt in list(wines['wine_type'])]for data, color, size in zip(data_points, colors, sizes):x, y, z = dataax.scatter(x, y, z, alpha=0.4, c=color, edgecolors='k', s=size)ax.set_xlabel('Residual Sugar')
ax.set_ylabel('Alcohol')
ax.set_zlabel('Fixed Acidity')

在这里插入图片描述

气泡图灵感来源与上文所述一致。但是,我们还可以看到以二氧化硫总量为指标的点数,发现白葡萄酒的二氧化硫含量高于红葡萄酒。

除了深度之外,我们还可以使用分面色调来表征这五个数据维度中的多个分类属性。其中表征大小的属性可以是数值表征甚至是类别(但是我们可能要用它的数值表征来表征数据点大小)。由于缺乏类别属性,此处我们不作展示,但是你可以在自己的数据集上试试。

g = sns.FacetGrid(wines, col="wine_type", hue='quality', col_order=['red', 'white'], hue_order=['low', 'medium', 'high'],aspect=1.2, size=3.5, palette=sns.light_palette("red", 4)[1:])g.map(plt.scatter, "residual sugar", "alcohol", alpha=0.9, edgecolor='white', linewidth=0.5, s=100)fig = g.fig 
fig.subplots_adjust(top=0.8, wspace=0.3)
fig.suptitle('Wine Type - Sulfur Dioxide - Residual Sugar - Alcohol - Quality', fontsize=14)
l = g.add_legend(title='Wine Quality Class')

在这里插入图片描述
通常还有一个前文介绍的 5 维数据可视化的备选方法。当看到我们先前绘制的图时,很多人可能会对多出来的维度深度困惑。该图重复利用了分面的特性,所以仍可以在 2 维面板上绘制出来且易于说明和绘制。

我们已经领略到多位数据可视化的复杂性!如果还有人想问,为何不增加维度?让我们继续简单探索下!

可视化 6 维数据(6-D)

我们继续在可视化中添加一个数据维度。我们将利用深度、色调、大小和形状及两个常规轴来描述所有 6 个数据维度。

我们将利用散点图和色调、深度、形状、大小的概念来可视化 6 维数据。

fig = plt.figure(figsize=(8, 6))
t = fig.suptitle('Wine Residual Sugar - Alcohol Content - Acidity - Total Sulfur Dioxide - Type - Quality', fontsize=14)
ax = fig.add_subplot(111, projection='3d')xs = list(wines['residual sugar'])
ys = list(wines['alcohol'])
zs = list(wines['fixed acidity'])
data_points = [(x, y, z) for x, y, z in zip(xs, ys, zs)]ss = list(wines['total sulfur dioxide'])
colors = ['red' if wt == 'red' else 'yellow' for wt in list(wines['wine_type'])]
markers = [',' if q == 'high' else 'x' if q == 'medium' else 'o' for q in list(wines['quality_label'])]for data, color, size, mark in zip(data_points, colors, ss, markers):x, y, z = dataax.scatter(x, y, z, alpha=0.4, c=color, edgecolors='k', s=size, marker=mark)ax.set_xlabel('Residual Sugar')
ax.set_ylabel('Alcohol')
ax.set_zlabel('Fixed Acidity')

在这里插入图片描述
这可是在一张图上画出 6 维数据!我们用形状表征葡萄酒的质量标注,优质(用方块标记),一般(用 x 标记),差(用圆标记):用色调表示红酒的类型,由深度和数据点大小确定的酸度表征总二氧化硫含量。

这个解释起来可能有点费劲,但是在试图理解多维数据的隐藏信息时,最好结合一些绘图组件将其可视化。

  • 结合形状和 y 轴的表现,我们知道高中档的葡萄酒的酒精含量比低质葡萄酒更高。
  • 结合色调和大小的表现,我们知道白葡萄酒的总二氧化硫含量比红葡萄酒更高。
  • 结合深度和色调的表现,我们知道白葡萄酒的酸度比红葡萄酒更低。
  • 结合色调和 x 轴的表现,我们知道红葡萄酒的残糖比白葡萄酒更低。
  • 结合色调和形状的表现,似乎白葡萄酒的高品质产量高于红葡萄酒。(可能是由于白葡萄酒的样本量较大)

我们也可以用分面属性来代替深度构建 6 维数据可视化效果。

 g = sns.FacetGrid(wines, row='wine_type', col="quality", hue='quality_label', size=4) g.map(plt.scatter, "residual sugar", "alcohol", alpha=0.5,  edgecolor='k', linewidth=0.5, s=wines['total sulfur dioxide']*2) fig = g.fig  fig.set_size_inches(18, 8) fig.subplots_adjust(top=0.85, wspace=0.3) fig.suptitle('Wine Type - Sulfur Dioxide - Residual Sugar - Alcohol - Quality Class - Quality Rating', fontsize=14) l = g.add_legend(title='Wine Quality Class') 

在这里插入图片描述
因此,在这种情况下,我们利用分面和色调来表征三个分类属性,并使用两个常规轴和大小来表征 6 维数据可视化的三个数值属性。

结论

数据可视化与科学一样重要。我们的目的不是为了记住所有数据,也不是给出一套固定的数据可视化规则。本文的主要目的是理解并学习高效的数据可视化策略,尤其是当数据维度增大时。以致我们可以用本文的知识可视化我们自己的数据集。


http://chatgpt.dhexx.cn/article/dp81QXB5.shtml

相关文章

python科学计算库安装

python科学计算相关的库包括numpy&#xff0c;scipy&#xff0c;matplotlib等&#xff0c;但是自己安装比较不容易&#xff0c;倒不是安装过程有多难&#xff0c;而是会出现各种各样的问题&#xff0c;现在做一记录 安装顺序numpy -> scipy - > matplotlib&#xff0c; …

python怎么进行计算_python怎么计算

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 下面是python中的一个函数计算代码:loops=25000000 from math import*a=range(1,loops)def f(x):return 3*cos(x)+4*sin(x)**2%timeit r=(f(x) for x in a)效率…

Python科学计算初探——余弦相似度

SciPy是世界上著名的Python开源科学计算库&#xff0c;建立在Numpy之上。它增加的功能包括数值积分、最优化、统计和一些专用函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。 安装科学计算包SciPy 由于SciPy库在Windows下使用pip intall安装失败…

【python科学计算发行版】

python科学计算发行版 python是科学计算的有力工具&#xff0c;但在进行计算过程中需要安装很多依赖包&#xff0c;会对使用造成不便&#xff0c;所以总结了一下几个包含丰富科学计算包的python发行版本供参考。 Windows下使用的Winpython著名的计算集合python(x,y)数据科学平…

Python科学计算pdf

下载地址&#xff1a;网盘下载 内容简介 编辑 本书介绍如何用Python开发科学计算的应用程序&#xff0c;除了介绍数值计算之外&#xff0c;还着重介绍如何制作交互式的2D、3D图像&#xff0c;如何设计精巧的程序界面&#xff0c;如何与C语言编写的高速计算程序结合&#xff0c;…

python科学计算的几个例子

python解常微分方程 python解常微分方程的步骤如下&#xff1a; 将计算区间分为n个小段&#xff0c;在每一小段上将求解的曲线作为直线处理&#xff1b;将一个n阶常微分方程转换成[y_n,y_n-1,…,y_i,…,y_0]向量的线性方程组&#xff0c;其中y_i表示y的i阶导数&#xff1b;确…

python科学计算与数据可视化——Matplotlib

Matplotlib&#xff08;https://matplotlib.org/&#xff09;是一个用来绘图的python库,它的matplotlib.pyplot模块提供了一个绘图系统。 matplotlib中最重要的函数就plot&#xff0c;它可以绘制二维图像 使用subplot函数&#xff0c;你就可以在同一个图像里绘制多个子图 #1.…

常用的python科学计算库有哪些_python科学计算常用的数学科学计算库有哪些?

1.numpy(高效多维数据表示) NumPy数组可以将许多数据处理任务表述为简洁的数组表达式,否则需要编写循环。用数组表达式代替循环的做法,通常被称为矢量化。通常矢量化数组运算要比等价的纯Python方式快上一两个数量级,尤其是各种数值计算。 假设我们想要在一组值(网格型)上计…

Python 初步了解科学计算和数据分析

推荐自己的专栏&#xff1a;分享一些Python案例&#xff0c;将所学用出来随着Python语言生态环境的完善&#xff0c;众多科学计算和数据分析库&#xff08;例如NumPy、SciPy、Pandas、Matplotlib、IPython等&#xff09;&#xff0c;使得Python成为科学计算和数据分析的首选语言…

Python科学计算

Python 科学计算 NumPy(MatLab 替代品之一) 数组的算数和逻辑运算傅立叶变换和用于图形操作的例程与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数 frmemeta SciPy&#xff08;科学计算&#xff09; SciPy是一个开源的算法库和数学工具包。 其包含最优化、线…

深度阐述数据建模及可视化系统技术方案

1.系统概述 数据建模及可视化系统系统是一站式全链路数据生命周期管家&#xff0c;帮助用户管理数据资产并挖掘价值。平台提供多源异构的数据采集模块、实时/离线计算框架&#xff0c;简洁易用的开发环境和平台接口&#xff0c;为政府机构、企业、科研机构、第三方软件服务商等…

数据可视化现状调研

数据可视化现状调研 概述 数据可视&#xff08;Data visualization&#xff09;数据可视化主要旨在借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。但是&#xff0c;这并不就意味着&#xff0c;数据可视化就一定因为要实现其功能用途而令人感到枯燥乏味&#xff0c;…

数据可视化课程大纲和教学设计及源代码

一、课程基本信息 二、课程定位 《数据可视化》课程是面向全校学生的一门公共选修课。本课程包括16学时的理论教学和16学时的实践教学&#xff0c;在校内完成。 《数据可视化》课程是一门理论性和实践性都很强的课程。本课程本着“技能培养为主、理论够用为度”的原则&#x…

工业数据可视化

工业大数据是指在工业领域中&#xff0c;围绕典型智能制造模式&#xff0c;从客户需求到销售、订单、计划、研发、设计、工艺、制造、采购、供应、库存、发货和交付、售后服务、运维、报废或回收再制造等整个产品全生命周期各个环节所产生的各类数据及相关技术和应用的总称。其…

数据可视化选择题

第一章 打开可视化大门 多选(3分) 可视化的分类包含&#xff1a; A.科学可视化B.信息可视化C.智能可视化D.可视分析学 ABD ‏2. 以下哪张图片为科学可视化结果&#xff1a; A. B. C. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cynHvYcn…

52个数据可视化图表鉴赏

文章目录 1.弧线图2.面积图3.箭头图4.条形图5.布林线指标6.箱线图7.气泡地图8.子弹图9.凹凸图10.日历图11.烛台图12.卡通图13.弦图14.分级统计图15.组合图表16.连接地图17.控制图18.南丁格尔玫瑰图19.交叉表20.环形图21.漏斗图22.甘特图23.热图24.六边形平铺地图25.直方图26.地…

解构数据可视化

文章目录 什么是数据可视化数据可视化四大过程1. 确定主题2. 提炼数据3. 确认图表4. 可视化设计及布局 可视化映射1. 可视化空间2. 标记3. 视觉通道 什么是数据可视化 数据可视化的目标是透过数据的表象&#xff0c;洞悉其中的规律&#xff0c;指导用户高效、准确地进行决策。 …

数据可视化学习之大屏学习

一 前言 什么是数据可视化大屏&#xff1f;数据可视化大屏是以大屏为主要展示载体的数据可视化设计。可视化大屏就是一种非常有效的数据可视化工具&#xff0c;它可以将业务的关键指标以可视化的方式展示到一个或多个LED屏幕上&#xff0c;不仅使业务人员能够从复杂的业务数据…

数据可视化学习路线

写在前面 有幸看到了这篇关于数据可视化学习的指导文章&#xff0c;由于原作链接访问异常&#xff0c;只得从百度快照中看到原文&#xff0c;所以这里搬运过来&#xff0c;特此声明本文系【转载】&#xff0c;在此感谢原作者&#xff0c;以下为原文正文(略有删减)。 原作者: 张…

数据挖掘——数据可视化

数据可视化 1.数据可视化第一关 数据可视化的内涵1>数据可视化是什么&#xff1f;2>为什么需要数据可视化&#xff1f;3>历史演变4>习题 第二关 初识数据第三关 柱状图第四关 散点图第五关 直方图 2.数据可视化进阶第一关 热图1>热图的作用&#xff1f;2>习题…