# 加载yellowbrick数据集
import os
import pandas as pd
FIXTURES = os.path.join(os.getcwd(), "data")
df = pd.read_csv(os.path.join(FIXTURES,"iris.csv"))
df.head()
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
df.head().to_dict()
{'sepal_length': {0: 5.1, 1: 4.9, 2: 4.7, 3: 4.6, 4: 5.0},
'sepal_width': {0: 3.5, 1: 3.0, 2: 3.2, 3: 3.1, 4: 3.6},
'petal_length': {0: 1.4, 1: 1.4, 2: 1.3, 3: 1.5, 4: 1.4},
'petal_width': {0: 0.2, 1: 0.2, 2: 0.2, 3: 0.2, 4: 0.2},
'species': {0: 'setosa', 1: 'setosa', 2: 'setosa', 3: 'setosa', 4: 'setosa'}}
import warnings
warnings.filterwarnings('ignore')
import numpy as np
from scipy.stats import norm
import seaborn as sns
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data=df.copy()
plt.style.use( 'seaborn-v0_8')
sns.set(style='white')
‘darkgrid’:深色网格样式
‘whitegrid’:白色网格样式,ggplot2
‘dark’:深色背景样式
‘white’:白色背景样式
‘ticks’:坐标轴刻度线样式
sns.barplot(x='species',y='petal_length',hue='species',data=data)
plt.show()
x: 指定 x 轴上要显示的数据列或数组。
y: 指定 y 轴上要显示的数据列或数组。
hue: 指定要分组的数据列或数组,根据该列的不同取值将数据分为不同的组,并使用不同的颜色进行区分。
data: 指定要使用的数据集,可以是 pandas 的 DataFrame、numpy 数组或其他类似结构的数据。
使用了 x=‘species’ 将 species 列的值用作 x 轴数据,y=‘petal_length’ 将 petal_length 列的值用作 y 轴数据,hue=‘species’ 根据 species 列的不同取值对数据进行分组,并使用不同的颜色进行区分。
import pandas as pd
fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
years = ['2015', '2016', '2017']
data = {'fruits': fruits,
'2015': [2, 1, 4, 3, 2, 4],
'2016': [5, 3, 3, 2, 4, 6],
'2017': [3, 2, 4, 4, 5, 3]}
df = pd.DataFrame(data)
df
fruits | 2015 | 2016 | 2017 | |
---|---|---|---|---|
0 | Apples | 2 | 5 | 3 |
1 | Pears | 1 | 3 | 2 |
2 | Nectarines | 4 | 3 | 4 |
3 | Plums | 3 | 2 | 4 |
4 | Grapes | 2 | 4 | 5 |
5 | Strawberries | 4 | 6 | 3 |
# 使用 melt() 函数将宽格式的数据转换为长格式,并创建复合列 x
df_melted = df.melt(id_vars='fruits', var_name='year', value_name='counts')
df_melted
fruits | year | counts | |
---|---|---|---|
0 | Apples | 2015 | 2 |
1 | Pears | 2015 | 1 |
2 | Nectarines | 2015 | 4 |
3 | Plums | 2015 | 3 |
4 | Grapes | 2015 | 2 |
5 | Strawberries | 2015 | 4 |
6 | Apples | 2016 | 5 |
7 | Pears | 2016 | 3 |
8 | Nectarines | 2016 | 3 |
9 | Plums | 2016 | 2 |
10 | Grapes | 2016 | 4 |
11 | Strawberries | 2016 | 6 |
12 | Apples | 2017 | 3 |
13 | Pears | 2017 | 2 |
14 | Nectarines | 2017 | 4 |
15 | Plums | 2017 | 4 |
16 | Grapes | 2017 | 5 |
17 | Strawberries | 2017 | 3 |
x = list(zip(df_melted['fruits'], df_melted['year']))
# 使用 Seaborn 绘制复合柱状图
sns.barplot(data=df_melted, x='fruits', y='counts', hue='year')
# 显示图表
plt.show()
# 使用 Seaborn 绘制复合柱状图
sns.barplot(data=df_melted, x='year', y='counts', hue='fruits')
# 显示图表
plt.show()
# 使用 Seaborn 绘制复合柱状图
sns.barplot(data=df_melted, x='year', y='counts', hue='fruits')
# 设置图例水平排列
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=3)
# 显示图表
plt.show()
# 使用 Seaborn 绘制复合柱状图
sns.barplot(data=df_melted, x='year', y='counts', hue='fruits')
# 调整图例位置和间距
plt.legend(loc='upper center', title='', bbox_to_anchor=(0.5, 1.2), ncol=3, labelspacing=0.2)
# 显示图表
plt.show()
import matplotlib.pyplot as plt
# 数据准备
fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
years = ["2015", "2016", "2017"]
colors = ["#c9d9d3", "#718dbf", "#e84d60"]
data = {'fruits' : fruits,
'2015' : [2, 1, 4, 3, 2, 4],
'2016' : [5, 3, 4, 2, 4, 6],
'2017' : [3, 2, 4, 4, 5, 3]}
# 绘制堆叠柱状图
bottom = [0] * len(fruits)
for year, color in zip(years, colors):
plt.bar(fruits, data[year], bottom=bottom, color=color, label=year)
bottom = [b + d for b, d in zip(bottom, data[year])]
# 设置标题和标签
plt.title("Fruit Counts by Year")
plt.xlabel("Fruits")
plt.ylabel("Counts")
# 添加图例
plt.legend()
# 显示图表
plt.show()
# 绘制水平柱状图
sns.barplot(data=df_melted, x='counts', y='fruits', hue='year', palette=colors, estimator=sum, orient='h')
# 设置标题和标签
plt.title("Fruit Counts by Year")
plt.xlabel("Counts")
plt.ylabel("Fruits")
# 显示图表
plt.show()
# 绘制水平柱状图
bottom = [0] * len(fruits)
for year, color in zip(years, colors):
plt.barh(fruits, data[year], left=bottom, color=color, label=year)
bottom = [b + d for b, d in zip(bottom, data[year])]
# 设置标题和标签
plt.title("Fruit Counts by Year")
plt.xlabel("Counts")
plt.ylabel("Fruits")
# 添加图例
plt.legend()
# 显示图表
plt.show()
sns.scatterplot(x='petal_length',y='sepal_length',hue='species',style='species',s=90,data=data)
plt.show()
下面是各个参数的含义:
x 和 y:表示散点图中 x 轴和 y 轴变量的名称。
hue:表示分类变量的名称。每个不同的类别将用不同的颜色表示。
style:表示分类变量的名称。每个不同的类别将使用不同的样式(例如圆形、三角形等)表示。
s:表示散点的大小。
data:表示包含数据的 Pandas 数据框。
在你提供的代码中,散点图的 x 轴变量为 petal_length,y 轴变量为 sepal_length。species 用作分类变量,并使用不同的颜色和样式来表示每个不同的类别。每个散点的大小由参数 s=90 指定。
sns.histplot(x='sepal_length',kde=True,data=data)
plt.show()
??sns.distplot
# 插入代码块:Distplot
plt.figure(figsize=(8, 6))
sns.distplot(data['sepal_length'], bins=16, color="firebrick",)
plt.show()
sns.histplot(x='sepal_length',kde=True,hue='species',data=data)
plt.show()
sns.lineplot(x='petal_length',y='petal_width',data=data)
# plt.grid(True)
plt.show()
sns.regplot(x='petal_length', y='petal_width', data=data)
# plt.grid(True)
plt.show()
x 和 y:表示散点图中 x 轴和 y 轴变量的名称。
data:表示包含数据的 Pandas 数据框。
scatter:表示是否绘制散点图。默认为 True。
fit_reg:表示是否绘制拟合曲线。默认为 True。
ci:表示用于计算置信区间的方法。默认为 95% 的置信区间,可设定为 None、‘sd’ 或 float 类型的值。
order:表示拟合曲线的阶数。默认为 1,即线性模型。
truncate:表示是否忽略位于 x 轴边缘的点。默认为 False。
x_jitter 和 y_jitter:表示添加的噪声大小,用于避免重叠的点。
color、marker、line_kws 等其他参数可以用于自定义拟合曲线和散点图的样式。
我们使用 sns.regplot() 函数来绘制散点图和拟合曲线。x=‘petal_length’ 和 y=‘petal_width’ 指定了 x 轴和 y 轴的变量。data=data 表示数据来自名为 data 的 Pandas 数据框。
如果你想只绘制散点图,可以将 fit_reg 参数设为 False。
from math import pi
# 数据准备
fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
years = ["2015", "2016", "2017"]
data = {'fruits' : fruits,
'2015' : [2, 1, 4, 3, 2, 4],
'2016' : [5, 3, 4, 2, 4, 6],
'2017' : [3, 2, 4, 4, 5, 3]}
# 转换数据为长格式
df = pd.DataFrame(data)
df_melted = pd.melt(df, id_vars=['fruits'], var_name='year', value_name='counts')
# 获取每个年份的最大值,用于设置雷达图的坐标轴范围
max_value = df_melted['counts'].max()
# 创建绘图区域
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
# 绘制雷达图
for year in years:
values = df_melted[df_melted['year'] == year]['counts'].tolist()
values.append(values[0]) # 让雷达图形成闭环
angles = [i / len(fruits) * 2 * pi for i in range(len(fruits))] # 分割圆周成等距离角度
angles.append(angles[0]) # 让雷达图形成闭环
sns.lineplot(x=angles, y=values, ax=ax)
ax.fill(angles, values, alpha=0.25) # 填充雷达区域
# plt.legend(years, loc='upper left')
# 调整图例位置和间距
# plt.legend(years, loc='upper left', title='', bbox_to_anchor=(0.5, 1.2), ncol=3, labelspacing=0.2)
# 设置雷达图的坐标轴范围和标签
ax.set_ylim(0, max_value)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(fruits)
ax.set_title("Fruit Counts by Year")
# 显示图表
plt.show()
sns.violinplot(x='species',y='petal_length',data=data,hue='species')
plt.show()
sns.boxplot(x='species',y='sepal_length',data=data,hue='species')
plt.show()
# 单个连续变量
ser = data['sepal_length']
plt.figure(figsize=(10, 6))
plt.subplot(211)
ser.plot.hist(bins = 10, density = True)
plt.title("Histogram of charges")
# 计算高斯分布
mu, std = norm.fit(ser)
x_vals = np.linspace(ser.min(), ser.max(), 100)
y_vals = norm.pdf(x_vals, mu, std)
# 绘制高斯分布曲线
plt.plot(x_vals, y_vals,color='orange')
plt.subplot(212)
ser.plot.box(vert=False)
heat_corr=data.iloc[:,0:4].corr()
sns.heatmap(heat_corr,annot=True)
plt.show()
heat_corr = data.iloc[:, 0:4].corr()
cmap = sns.color_palette("Set2")
sns.heatmap(heat_corr, annot=True, cmap=cmap)
plt.show()
sns.pointplot(x='species',y='petal_length',data=data,markers ='^',color='g')
plt.show()
x 和 y:表示 x 轴和 y 轴的变量名称。
data:表示包含数据的 Pandas 数据框。
markers:表示点图中使用的标记符号。默认为 None。
color:表示点图中的颜色。默认为 None。
ci:表示用于计算置信区间的方法。默认为 95% 的置信区间,可设定为 None、‘sd’ 或 float 类型的值。
estimator:表示要计算的统计量。默认为均值,可设定为 numpy.median 等函数。
我们使用 sns.pointplot() 函数来绘制点图。x=‘species’ 和 y=‘petal_length’ 分别指定了 x 轴和 y 轴的变量。data=data 表示数据来自名为 data 的 Pandas 数据框。
此外,我们还使用了 markers=‘^’ 来指定点图中使用的标记符号为三角形,color=‘g’ 来指定点图的颜色为绿色。
sns.kdeplot(x='petal_length',data=data,hue='species',multiple='stack')
plt.show()
sns.kdeplot(x='petal_length', y='sepal_length', data=data, hue='species')
plt.show()
sns.countplot(x='species', data=data)
plt.show()
# 创建随机颜色列表
num_colors = len(data['species'].unique())
color_palette = sns.color_palette('muted', num_colors) # hls
# 绘制 countplot,并设置随机颜色
sns.countplot(x='species', data=data, palette=color_palette)
plt.show()
sns.color_palette() 函数有几个常用的参数,可以通过这些参数来指定颜色列表或颜色映射。
以下是sns.color_palette() 的主要参数:
palette: 可以接受预定义的颜色名称,也可以传递一个颜色列表。常用的预定义颜色名称有:‘deep’、‘muted’、‘bright’、‘pastel’、‘dark’、‘colorblind’ 等。
n_colors: 指定要从调色板中选择的颜色数量。
as_cmap: 如果设置为 True,将返回一个颜色映射而不是颜色列表。
以下是一些常见的预定义调色板名称:
‘deep’: 深色调色板
‘muted’: 柔和色调调色板
‘bright’: 鲜明明亮的调色板
‘pastel’: 柔和的粉彩调色板
‘dark’: 深色调色板
‘colorblind’: 配色方案适用于色盲的调色板
sns.swarmplot(x='sepal_width',y='species',data=data,hue='species',dodge=True,orient='h',size=8)
plt.show()
sns.set(rc = {"figure.figsize":(6,3)}) # 特征多的时候不要用,速度慢
sns.pairplot(data=data,hue='species')
plt.show()
Seaborn中的FacetGrid函数将数据集和一个或多个分类变量作为输入,并创建一个图表网格,每种类别变量的组合都有一个图表。网格中的每个图都可以定制为不同类型的图,例如散点图、直方图或箱形图。
g=sns.FacetGrid(data, col="species",height=4,hue='species')
g.map(sns.histplot, "petal_length")
plt.show()
联合分布图将两个不同的图组合在一个表示中,可以展示两个变量之间的关系(二元关系)
sns.jointplot(x="sepal_length", y="sepal_width", data=data,
palette='Set2',hue='species') # hue分组
plt.show()
# 插入代码块:Distplot
plt.figure(figsize=(8, 6))
# 使用Seaborn绘制二维关系图
sns.jointplot(x="sepal_length", y="sepal_width",data=data, height=7) # color="lightsalmon",
plt.show()
# 插入代码块:jointplot
plt.figure(figsize=(8, 6))
# 绘制Hexbin图
sns.jointplot(x="sepal_length", y="sepal_width", data=data, kind="hex", color="lightcoral")
plt.suptitle("Hexbin Plot", y=1.02)
plt.show()
cat图(分类图的缩写)是Seaborn中的定制的一种图,它可以可视化数据集中一个或多个分类变量与连续变量之间的关系。它可用于显示分布、比较组或显示不同变量之间的关系。
sns.catplot(data=data, x="petal_length", y="species", kind="violin", color=".9", inner=None)
sns.swarmplot(data=data, x="petal_length", y="species", size=3)
plt.show()