数据可视化第二版-03部分-08章-分布
创始人
2025-05-29 06:22:19
0

文章目录

  • 数据可视化第二版-03部分-08章-分布
    • 总结
    • 可视化视角-分布
    • 代码实现
      • 直方图
        • 直方图案例1
        • 直方图示例2
        • 直方图与趋势线
        • 直方图与趋势线2
        • 分组直方图
        • 变形
      • 密度图
        • 密度图1
        • 密度图2-堆积密度图
        • 密度图3-二维密度图
        • 密度图4-边际密度图
        • 密度图5-镜像密度图
        • 密度图6-横向密度图
      • 箱线图
        • 箱线图1
        • 箱线图2-带数据点的盒须图
        • 箱线图3-横向合须图
        • 箱线图4-分组合须图
      • 小提琴图
        • 小提琴图-
        • 小提琴图-学生成绩与性别以及父母婚姻状况的关系
        • 小提琴图-多个小提提琴图
        • 小提琴图-带数据点的小提琴图
        • 小提琴图-横向小提琴图
      • 嵴线图
        • 嵴线图-
        • 嵴线图-
        • 嵴线图-
    • 教材截图

数据可视化第二版-03部分-08章-分布

总结

本系列博客为基于《数据可视化第二版》一书的教学资源博客。本文主要是第8章,分布可视化的案例相关。

可视化视角-分布

在这里插入图片描述

在这里插入图片描述

代码实现

安装依赖

pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple

直方图

直方图依赖

from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from numpy.random import randn
import matplotlib as mpl
import seaborn as sns
from scipy.stats.kde import gaussian_kde
from scipy.stats import norm
from numpy import linspace, hstack
from pylab import plot, show, hist

直方图案例1

# 直方图
df = datasets.load_iris()plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.figure(figsize=(10, 8))  # 设置画布大小
plt.hist(df.data[:, 0],  # 选择鸢尾花数据集的第一个特征bins=20,  # 设置分组数量alpha=0.5,  # 颜色透明度color="r",  # 直方图矩形填充颜色edgecolor="black",  # 直方图矩形边框颜色range=(4, 8.5))  # 设置直方图边界
plt.xlabel(df.feature_names[0])  # x标签
plt.ylabel("频数密度")  # y标签
plt.title("鸢尾花数据集特征分布直方图")
plt.show()

在这里插入图片描述

直方图示例2

# 直方图示例
data = np.random.randn(1000)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 8))  # 设置画布大小
plt.hist(data,bins=15,  # 设置分组数量alpha=0.5,  # 颜色透明度color="blue",  # 直方图矩形填充颜色edgecolor="black")  # 直方图矩形边框颜色
plt.xlabel("")  # x标签
plt.ylabel("频数密度")  # y标签
plt.title("直方图示例")
plt.show()

在这里插入图片描述

直方图与趋势线

# 直方图与趋势线
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = Falsesample1 = norm.rvs(loc=-1.0, scale=1, size=320)
sample2 = norm.rvs(loc=2.0, scale=0.6, size=320)
sample = hstack([sample1, sample2])
probDensityFun = gaussian_kde(sample)
x = linspace(-5, 5, 200)
plot(x, probDensityFun(x))
hist(sample, density=True, alpha=0.5, color="purple")
plt.title("直方图与趋势线")
show()

在这里插入图片描述

直方图与趋势线2

# 直方图与趋势线2
data = randn(250)
sns.set_palette("hls")
plt.rcParams['axes.unicode_minus'] = Falsempl.rc("figure", figsize=(10, 6))
sns.displot(data, bins=10, kde=True,rug=True,color='b')
plt.title("直方图与趋势线2")
plt.show()

在这里插入图片描述

分组直方图

import os
os.chdir(os.path.dirname(__file__))
iris = pd.read_csv("鸢尾花.csv")plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.figure(figsize=(8, 6))  # 设置画布大小
sns.histplot(data=iris, x="Sepal.Length", hue="Species", alpha=0.5)
plt.title("分组直方图")
plt.xlabel("萼片长度")
plt.show()

在这里插入图片描述

变形

# 变形
# 创建数据集
df = pd.DataFrame({'var1': np.random.normal(size=1000),'var2': np.random.normal(loc=2, size=1000) * -1
})
# 画布大小
plt.rcParams["figure.figsize"] = 10, 6
plt.rcParams['axes.unicode_minus'] = False
# 画变量1的频率分布直方图
sns.histplot(x=df.var1, stat="density", bins=20)
# 画变量2的频率分布直方图
n_bins = 20
# 获得变量2的分组
heights, bins = np.histogram(df.var2, density=True, bins=n_bins)
# 给变量2的高度乘以1
heights *= -1
bin_width = np.diff(bins)[0]
bin_pos = (bins[:-1] + bin_width / 2) * -1
plt.bar(bin_pos, heights, width=bin_width, edgecolor='black')
plt.title("变形")
plt.show()

在这里插入图片描述

密度图

密度图1

# 密度图1
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.figure(figsize=(8, 6))  # 设置画布大小
sns.kdeplot(data=iris, x="Sepal.Length", hue="Species", alpha=0.5, fill="Species")
plt.title("密度图1")
plt.show()

在这里插入图片描述

密度图2-堆积密度图

# 密度图2
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
sns.kdeplot(data=iris.iloc[:, [1, 2, 5]], x="Sepal.Width", hue="Species", common_norm=False, multiple="fill", alpha=1)
plt.title("花萼长度关于花萼宽度的堆积密度图")
plt.xlabel("花萼宽度")
plt.show()

在这里插入图片描述

密度图3-二维密度图

# 密度图3
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import os
os.chdir(os.path.dirname(__file__))
iris = pd.read_csv("鸢尾花.csv")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
sns.kdeplot(x=iris.iloc[:, 1], y=iris.iloc[:, 2], cmap="Reds", fill=True, bw_adjust=.5)
plt.xlabel("花萼长度")
plt.ylabel("花萼宽度")
plt.title("密度图3")
plt.show()

在这里插入图片描述

密度图4-边际密度图

# 密度图4
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as snsiris = pd.read_csv("鸢尾花.csv")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = False
sns.jointplot(x=iris["Petal.Length"], y=iris["Petal.Width"], kind='kde', cmap="Reds", fill=True)
plt.title("密度图4")
plt.show()

在这里插入图片描述

密度图5-镜像密度图

# 密度图5import numpy as np
from numpy import linspace
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde# 创建数据
df = pd.DataFrame({'var1': np.random.normal(size=1000),'var2': np.random.normal(loc=2, size=1000) * -1
})
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = False
# 画变量1的核密度图
sns.kdeplot(data=df, x="var1", fill=True, alpha=1)
# 画变量2的密度图
kde = gaussian_kde(df.var2)
x_range = linspace(min(df.var2), max(df.var2), len(df.var2))
sns.lineplot(x=x_range * -1, y=kde(x_range) * -1, color='orange')
plt.fill_between(x_range * -1, kde(x_range) * -1, color='orange')
plt.xlabel("数值")
plt.axhline(y=0, linestyle='-', linewidth=1, color='black')
plt.title("密度图5")
# show the graph
plt.show()

在这里插入图片描述

密度图6-横向密度图

# 密度图6import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")iris = pd.read_csv("鸢尾花.csv")plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.figure(figsize=(8, 6))  # 设置画布大小
sns.kdeplot(data=iris, x="Sepal.Length", alpha=0.5, fill="red", vertical=True)
plt.title("密度图6")
plt.show()

在这里插入图片描述

箱线图

箱线图1

# 箱线图1
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
sns.boxplot(x=df["Species"], y=df["Petal.Width"])
plt.xlabel("种类")
plt.ylabel("花瓣宽度")
plt.title("箱线图1", fontsize=10)
plt.show()

在这里插入图片描述

箱线图2-带数据点的盒须图

# 箱线图2
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
sns.boxplot(x=df["Species"], y=df["Petal.Width"])
sns.stripplot(x="Species", y="Petal.Width", data=df, jitter=0.6, color="pink")
plt.xlabel("种类")
plt.ylabel("花瓣宽度")
plt.title("带数据点的盒须图", fontsize=10)
plt.show()

在这里插入图片描述

箱线图3-横向合须图

# 箱线图3
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
sns.boxplot(y=df["Species"], x=df["Petal.Width"], )
plt.xlabel("种类")
plt.ylabel("花瓣宽度")
plt.title("横向盒须图", fontsize=10)
plt.show()

在这里插入图片描述

箱线图4-分组合须图

# 箱线图4
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
iris = pd.read_csv("鸢尾花2.csv")
df = iris
sns.boxplot(x=df["属性"], y=df["指标值"], hue=(df["种类"]), )
plt.xlabel("属性")
plt.ylabel("")
plt.title("分组盒须图", fontsize=10)
plt.show()

在这里插入图片描述

小提琴图

小提琴图-

# 小提琴图1
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
sns.violinplot(x=df["Species"], y=df["Petal.Width"])
plt.xlabel("种类")
plt.ylabel("花瓣宽度")
plt.title("小提琴图", fontsize=10)
plt.show()

在这里插入图片描述

小提琴图-学生成绩与性别以及父母婚姻状况的关系

# 小提琴图2
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import warnings
import os
os.chdir(os.path.dirname(__file__))warnings.filterwarnings("ignore")score = pd.read_csv("student/student-mat.csv", sep=";")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
df = score
sns.violinplot(y=df["G3"], x=df["Pstatus"], hue=(df["sex"]), split=True)
plt.xlabel("父母婚姻状况")
plt.ylabel("学生分数")
plt.title("学生成绩与性别以及父母婚姻状况的关系", fontsize=10)
plt.show()

在这里插入图片描述

小提琴图-多个小提提琴图

# 小提琴图3
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
fig = plt.figure(figsize=(14, 14))
fig.suptitle("多个小提琴图")
plt.subplot(2, 2, 1)
sns.violinplot(x=df["Species"], y=df["Petal.Width"], inner="box")
plt.subplot(2, 2, 2)
sns.violinplot(x=df["Species"], y=df["Petal.Width"], inner="point")
plt.subplot(2, 2, 3)
sns.violinplot(x=df["Species"], y=df["Petal.Width"], inner="stick")
plt.subplot(2, 2, 4)
sns.violinplot(x=df["Species"], y=df["Petal.Width"], inner="quartile")plt.show()

在这里插入图片描述

小提琴图-带数据点的小提琴图

# 小提琴图4import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体sns.violinplot(x=df["Species"], y=df["Petal.Width"])
sns.stripplot(x="Species", y="Petal.Width", data=df, jitter=0.2, color="pink")
plt.xlabel("种类")
plt.ylabel("花瓣宽度")
plt.title("带数据点的小提琴图", fontsize=10)
plt.show()

在这里插入图片描述

小提琴图-横向小提琴图

# 小提琴图5
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.chdir(os.path.dirname(__file__))iris = pd.read_csv("鸢尾花.csv")
df = iris
sns.violinplot(y=df["Species"], x=df["Sepal.Length"], )
plt.xlabel("种类")
plt.ylabel("花瓣宽度")
plt.title("横向小提琴图", fontsize=10)
plt.show()

在这里插入图片描述

嵴线图

嵴线图-

# 脊线图1
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm  # 色谱
import joypy
import os
os.chdir(os.path.dirname(__file__))tm1 = pd.read_csv("北京pm2.5数据.csv", sep=",")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = False
tm2 = tm1.iloc[:, [2, 7]]
tm2 = tm2.dropna()
fig, axs = joypy.joyplot(tm2, by="month", fill=True, legend=True, alpha=.8,range_style='own', xlabelsize=22, ylabelsize=22,grid='both', linewidth=.8, linecolor='k', figsize=(8, 6), colormap=(cm.Spectral_r))
plt.title("Ridgeline plot1")
plt.show()

在这里插入图片描述

嵴线图-

# 脊线图2
import pandas as pd
import matplotlib.pyplot as plt
import joypy
import os
os.chdir(os.path.dirname(__file__))tm1 = pd.read_csv("北京pm2.5数据.csv", sep=",")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = False
tm2 = tm1.iloc[:, [2, 7]]
tm2 = tm2.dropna()
fig, axs = joypy.joyplot(tm2, by="month", fill=True, legend=True, alpha=.8, hist=True, bins=40,range_style='own', xlabelsize=22, ylabelsize=22,linewidth=.8, linecolor='k', figsize=(8, 6))
plt.title("Ridgeline plot2")
plt.show()

在这里插入图片描述

嵴线图-

# 脊线图3
import pandas as pd
import matplotlib.pyplot as plt
import joypy
import os
os.chdir(os.path.dirname(__file__))tm1 = pd.read_csv("鸢尾花.csv", sep=",")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加中文字体
plt.rcParams['axes.unicode_minus'] = False
tm2 = tm1.dropna()
fig, axs = joypy.joyplot(tm2, by="Species", column="Sepal.Length", fill=True, legend=True, alpha=.8,range_style='own', xlabelsize=22, ylabelsize=22,grid='both', linewidth=.8, linecolor='k', figsize=(8, 6))
plt.title("Ridgeline plot3")
plt.show()

在这里插入图片描述

教材截图

在这里插入图片描述

相关内容

热门资讯

宽基ETF被抢筹,市场风格走向... 近期,股票市场震荡加剧,宽基类ETF(交易型开放式指数基金)的成交明显放量。截至12月17日,近一个...
价值10万的皮肤“到手价”仅6... 近日,围绕腾讯手游《金铲铲之战》(下称《金铲铲》)新赛季核心活动“不朽传奇召唤”的重大规则失误,一场...
成本3元卖60元,“99%高纯... 宣传“99%高纯”的产品,实测核心成分含量竟为0?近期,北京同仁堂一款南极磷虾油被质疑虚假宣传,在舆...
深夜,全线狂飙!美联储,突传重... 美股全线反攻!今晚,美股三大指数集体高开,纳指、标普500指数均大涨超1%,芯片股全线大涨,美光科技...
国盾量子公告:公司董事长吕品不... 科大国盾量子技术股份有限公司(以下简称“公司”)董事会沉痛公告,公司董事长吕品先生不幸逝世。吕品先生...
芯原股份弃“芯来”追“逐点” ... 中经记者 顾梦轩 李正豪 广州、北京报道虽然终止收购芯来智融,但芯原股份(688521.SH)收购逐...
国盾量子董事长意外离世,警方通... 12月18日晚间,国盾量子发布公告,公司董事长吕品不幸逝世。吕品于2025年5月起担任公司董事长,并...
开源中国马越:除了DeepSe... “靠烧钱做to B市场的时代一去不复返了。”文|《中国企业家》记者 闫俊文编辑|何伊凡见习编辑|李原...
“白酒第二”不稳,业绩被汾酒反... 出品|达摩财经12月18日,以“新形势 新机遇 新征程”为主题的五粮液第二十九届“12·18”共识共...
康师傅更换CEO,创始人之子将... 红星资本局12月18日消息,今日,康师傅(康师傅控股,0322.HK)公告称,原首席执行官陈应让已决...