该笔记为个人学习笔记,看的课程是B站-数学建模老哥:9 Python高级绘图_哔哩哔哩_bilibili
数据集来源:
数学建模老哥-python基础和机器学习(二)基于鸢尾花数据集简单机器学习-CSDN博客
数学建模老哥-python基础和机器学习(四)数据导入+数据理解+数据可视化-CSDN博客
目录
2.4.7.1折线图
2.4.7.1.1基本使用
# 导入必要的库
# 注意数据为连续的 离散会变成散点图
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
warnings.filterwarnings("ignore") # 忽略所有警告信息
# 生成数据
col1 = np.linspace(0, 10, 1000) # 创建一个从0到10的等差数列,包含1000个点
col2 = np.sin(col1) # 计算col1中每个点的正弦值
df = pd.DataFrame({"C1": col1, "C2": col2}) # 创建一个DataFrame,包含两列:C1和C2
# 设置pandas的显示选项,以便可以显示所有列(虽然在这个例子中只有两列)
pd.set_option('display.max_columns', None)
# 打印DataFrame的前10行(虽然这里只有1000行,但展示前10行是一个好习惯)
print(df.head(10))
# 使用Seaborn的lineplot函数绘制折线图
# 设置matplotlib的样式为'seaborn-darkgrid'
plt.style.use('seaborn-darkgrid')
# 注意:在Jupyter Notebook中,你可能需要使用'%matplotlib inline'来确保图像直接显示在Notebook中
# 但如果你在脚本或PyCharm等IDE中运行,则不需要这行
# 绘制折线图
sns.lineplot(x=df.C1, y=df.C2, data=df) # 指定x轴为C1,y轴为C2,数据源为df
# 显示图像
plt.show()
2.4.7.1.2实际实例
#鸢尾花数据集举例子
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
spotify = pd.read_csv('iris.csv', names=names) # 如果CSV文件的第一行已经是列名,请去掉names参数
# 设置pandas的选项,以便在打印DataFrame时显示所有列
pd.set_option('display.max_columns', None)
# 打印DataFrame的前10行以查看数据结构
print(spotify.head(10))
# 假设我们使用SepalLengthCm作为y轴数据,这里我们不使用真实的日期或时间索引,而是使用默认的整数索引
plt.figure(figsize=(20, 8))
#sns.lineplot(x=spotify.index, y='SepalLengthCm', data=spotify)
# 如果想为每个种类绘制不同的线,我们可以使用hue参数(但请注意,这可能会使图形非常混乱
sns.lineplot(x=spotify.index, y='SepalLengthCm', hue='class', data=spotify)
# 显示图形
plt.show()
2.4.7.1.3样式使用
employment = pd.read_excel('rate.xlsx')
pd.set_option('display.max_columns', None)
print(employment.head(10))
plt.figure(figsize=(14,7))
plt.style.use('seaborn-darkgrid')
# 设置Seaborn绘图的默认样式
sns.set(rc={'xtick.labelsize': 17, 'ytick.labelsize': 10, 'axes.labelsize': 12, 'axes.grid': False})
# 绘制线图
#markers=True:这个参数用于在每个数据点上添加标记(如圆点、方块等)
#dashes=False:这个参数确保所有的线都是实线,没有虚线部分
#err_style='bars' 指定误差条(error bars)的样式
#hue='B' 按照B分类
#style='C' 按照C分组
#ci=70 误差区间70%
# palette='CMRmap', # 使用 'CMRmap' 颜色映射表
#markers=['o', '>'], # 尝试为不同性别设置不同的标记,但注意这通常与 hue/style 一起使用时可能不会按预期工作
# 因为 markers 参数期望的是一个单一的标记或者一个与数据点数量相等的标记列表
"""
plt.text(0.2, 0.84, 'GENDER', fontsize=40, color='black')
# 注意:这里的坐标 (0.2, 0.84) 是相对于图形大小的,可能需要调整以获得所需的位置
# 如果想要添加标题,则更常见的是使用
plt.title('GENDER', fontsize=40, color='black')
# 这会将“GENDER”添加到图形的顶部中央,并自动调整位置
"""
plt.gcf().text(.2,.84,'GENDER',fontsize=40,color='Black')
sns.lineplot(x='rate', y='A', style='C', markers=True, dashes=False, palette='CMRmap',data=employment)
plt.show()
2.4.7.1.4总代码
# 导入必要的库
import matplotlib.pyplot as plt
import numpy as np
import openpyxl as openpyxl
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
# warnings.filterwarnings("ignore") # 忽略所有警告信息
# # 生成数据
# col1 = np.linspace(0, 10, 1000) # 创建一个从0到10的等差数列,包含1000个点
# col2 = np.sin(col1) # 计算col1中每个点的正弦值
# df = pd.DataFrame({"C1": col1, "C2": col2}) # 创建一个DataFrame,包含两列:C1和C2
# # 设置pandas的显示选项,以便可以显示所有列(虽然在这个例子中只有两列)
# pd.set_option('display.max_columns', None)
# # 打印DataFrame的前10行(虽然这里只有1000行,但展示前10行是一个好习惯)
# print(df.head(10))
# # 使用Seaborn的lineplot函数绘制折线图
# # 设置matplotlib的样式为'seaborn-darkgrid'
# plt.style.use('seaborn-darkgrid')
# # 注意:在Jupyter Notebook中,你可能需要使用'%matplotlib inline'来确保图像直接显示在Notebook中
# # 但如果你在脚本或PyCharm等IDE中运行,则不需要这行
# # 绘制折线图
# sns.lineplot(x=df.C1, y=df.C2, data=df) # 指定x轴为C1,y轴为C2,数据源为df
# # 显示图像
# plt.show()
#设置索引为Date
# 读取CSV文件,将'Date'列设置为索引,并转换为Datetime类型(这里我们先不直接转换索引,稍后在单独步骤中处理)
# spotify = pd.read_csv('spotify.csv', index_col='Date')
# # 设置pandas的选项,以便在打印DataFrame时显示所有列
# pd.set_option('display.max_columns', None)
# # 打印DataFrame的前10行以查看数据结构
# print(spotify.head(10))
# # 将索引(即'Date'列)转换为Datetime类型
# spotify.index = pd.to_datetime(spotify.index)
# # 创建一个图形对象,设置图形的大小
# plt.figure(figsize=(20, 8))
# # 使用Seaborn的lineplot绘制折线图
# # 注意:这里需要指定x和y参数,或者通过data参数和hue参数来绘制多线图
# # 假设我们想要绘制'Streams'(假设存在这样一个列)随时间的变化
# # 如果要绘制所有列,需要循环或选择特定的列作为y轴,但这里只演示一个示例
# sns.lineplot(x=spotify.index, y='Streams', data=spotify) # 假设'Streams'是DataFrame中的一个列名
# # 显示图形
# plt.show()
#hue 分类展示
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
spotify = pd.read_csv('iris.csv', names=names) # 如果CSV文件的第一行已经是列名,请去掉names参数
# 设置pandas的选项,以便在打印DataFrame时显示所有列
pd.set_option('display.max_columns', None)
# 打印DataFrame的前10行以查看数据结构
print(spotify.head(10))
# 假设我们使用SepalLengthCm作为y轴数据,这里我们不使用真实的日期或时间索引,而是使用默认的整数索引
plt.figure(figsize=(20, 8))
#sns.lineplot(x=spotify.index, y='SepalLengthCm', data=spotify)
# 如果想为每个种类绘制不同的线,我们可以使用hue参数(但请注意,这可能会使图形非常混乱
sns.lineplot(x='SepalLengthCm', y=spotify.index, hue='class', data=spotify)
# 显示图形
plt.show()
employment = pd.read_excel('rate.xlsx')
pd.set_option('display.max_columns', None)
print(employment.head(10))
plt.figure(figsize=(14,7))
plt.style.use('seaborn-darkgrid')
# 设置Seaborn绘图的默认样式
sns.set(rc={'xtick.labelsize': 17, 'ytick.labelsize': 10, 'axes.labelsize': 12, 'axes.grid': False})
# 绘制线图
#markers=True:这个参数用于在每个数据点上添加标记(如圆点、方块等)
#dashes=False:这个参数确保所有的线都是实线,没有虚线部分
#err_style='bars' 指定误差条(error bars)的样式
#hue='B' 按照B分类
#style='C' 按照C分组
#ci=70 误差区间70%
# palette='CMRmap', # 使用 'CMRmap' 颜色映射表
#markers=['o', '>'], # 尝试为不同性别设置不同的标记,但注意这通常与 hue/style 一起使用时可能不会按预期工作
# 因为 markers 参数期望的是一个单一的标记或者一个与数据点数量相等的标记列表
"""
plt.text(0.2, 0.84, 'GENDER', fontsize=40, color='black')
# 注意:这里的坐标 (0.2, 0.84) 是相对于图形大小的,可能需要调整以获得所需的位置
# 如果想要添加标题,则更常见的是使用
plt.title('GENDER', fontsize=40, color='black')
# 这会将“GENDER”添加到图形的顶部中央,并自动调整位置
"""
plt.gcf().text(.2,.84,'GENDER',fontsize=40,color='Black')
sns.lineplot(x='rate', y='A', style='C', markers=True, dashes=False, palette='CMRmap',data=employment)
plt.show()
2.4.7.2散点图
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
employment = pd.read_excel('rate.xlsx')
sns.relplot(x='rate',y='A', hue='B',data=employment, height=7,aspect=2)
plt.show()
"""
# 使用seaborn的relplot函数绘制关系图
sns.relplot(
x='Period', # x轴上的数据列名,这里假设是时间周期
y='Unemployed', # y轴上的数据列名,这里假设是失业人数
hue='Gender', # 根据这个列的值来区分不同的颜色,这里假设是性别
col='Age', # 根据这个列的值来创建多个子图,每个子图对应一个年龄组
kind='line', # 图表类型,这里是折线图
col='sex', # 根据这个列的值来创建多个子图,每个子图对应一个性别
row='region', # 根据这个列的值来创建多个子图的行,每个行对应一个地区
data=employment, # DataFrame的名称,这里假设包含所有所需数据的DataFrame名为employment
height=6, # 每个子图的高度(英寸)
aspect=1, # 子图的宽高比,这里设置为1意味着子图将是正方形的
col_wrap=4, # 子图在水平方向上的最大列数,这里设置为4意味着每行最多4个子图
linewidth=2, # 线条的宽度
) # 注意这里添加了闭合的括号
"""
2.4.7.3密度图
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
iris = pd.read_csv('../iris.csv', names=names)
# shade=True 表示填充区域下方,cmap='Reds' 设置颜色映射为蓝色系,shade_lowest=True 表示填充最低密度区域
sns.kdeplot(data=iris, x='SepalWidthCm', y='SepalLengthCm', shade=True, cmap='Blues', shade_lowest=True)
plt.show()
# sns.swarmplot 用于绘制分类数据的分布,其中每个类别的值以点云的形式表示。
# figsize 参数控制图形的大小(宽度和高度)。
plt.figure(figsize=(7, 7)) # 创建新的图形窗口
sns.swarmplot(x='class', y='PetalWidthCm', data=iris)
plt.show()
2.4.7.4直方图
2.4.7.4.1基本知识
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
warnings.filterwarnings("ignore")
# 基本知识
# 生成一个正态分布的随机数组,均值为1,标准差为10,样本数量为1000
mpl.rcParams.update(mpl.rcParamsDefault)
num = np.random.normal(1,10,1000)
sns.distplot(num)
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
warnings.filterwarnings("ignore")
# 基本知识
# 生成一个正态分布的随机数组,均值为1,标准差为10,样本数量为1000
mpl.rcParams.update(mpl.rcParamsDefault)
num = np.random.normal(1,10,1000)
# sns.distplot(num)
# plt.show()
sns.displot(num, kde=False) # 直方图,不带KDE 没有核密度估计
plt.show()
sns.displot(num, kde=True) # 直方图,不带KDE 有核密度估计
plt.show()
2.4.7.4.2实际实例
#实际实例
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
warnings.filterwarnings("ignore")
housing = pd.read_csv('../housing.csv')
print(housing.head())
plt.show()
#bins=40:这个参数表示将数据分成40个区间
#figsize=(20,20):这个参数设置图形的大小 单位是英寸
housing.hist(bins=40 ,figsize=(20,20))
plt.show()
#多个图 三行三列
fig1 ,axes = plt.subplots(nrows=3,ncols=3 ,figsize = (20,20))
#ax=axes[0, 0]: 这指定了要在哪个子图上绘制直方图。axes是一个二维数组,代表多个子图,这里我们选择了第一个子图(索引为[0, 0])
#kde=False: 这个参数决定是否在直方图上绘制核密度估计曲线。设置为False表示不绘制。
sns.distplot(housing["CRIM"], color="#00bcd4",ax=axes[0, 0] , kde=False , bins=20)
sns.distplot(housing["ZN"], color="#937d14",ax=axes[0, 1], kde=False ,bins=20)
sns.distplot(housing["INDUS"], color="#006600", ax=axes[0, 2],kde=False, bins=20)
sns.distplot(housing["CHAS"] , color="#ff1e56", ax=axes[1,0], kde=False ,bins=20)
sns.distplot(housing["NOX"],color="#216353",ax=axes[1, 1], kde=False,bins=20)
sns.distplot(housing["RM"], color="#FF8F00", ax=axes[1,2],kde=False ,bins=20)
sns.distplot(housing["AGE"], color="#33FF00", ax=axes[2, 0], kde=False,bins=20)
sns.distplot(housing["DIS"], color="#FF3300", ax=axes[2, 1], kde=False,bins=20)
sns.distplot(housing["RAD"], color="#cccc00", ax=axes[2, 2],kde=False,bins=20)
plt.show()
2.4.7.4.3总代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
warnings.filterwarnings("ignore")
# 基本知识
# 生成一个正态分布的随机数组,均值为1,标准差为10,样本数量为1000
# mpl.rcParams.update(mpl.rcParamsDefault)
# num = np.random.normal(1,10,1000)
# # sns.distplot(num)
# # plt.show()
#
# sns.displot(num, kde=True) # 直方图,不带KDE 有核密度估计
# plt.show()
#实际实例
housing = pd.read_csv('../housing.csv')
print(housing.head())
# plt.show()
# #bins=40:这个参数表示将数据分成40个区间
# #figsize=(20,20):这个参数设置图形的大小 单位是英寸
# housing.hist(bins=40 ,figsize=(20,20))
# plt.show()
#多个图 三行三列
fig1 ,axes = plt.subplots(nrows=3,ncols=3 ,figsize = (20,20))
#ax=axes[0, 0]: 这指定了要在哪个子图上绘制直方图。axes是一个二维数组,代表多个子图,这里我们选择了第一个子图(索引为[0, 0])
#kde=False: 这个参数决定是否在直方图上绘制核密度估计曲线。设置为False表示不绘制。
sns.distplot(housing["CRIM"], color="#00bcd4",ax=axes[0, 0] , kde=False , bins=20)
sns.distplot(housing["ZN"], color="#937d14",ax=axes[0, 1], kde=False ,bins=20)
sns.distplot(housing["INDUS"], color="#006600", ax=axes[0, 2],kde=False, bins=20)
sns.distplot(housing["CHAS"] , color="#ff1e56", ax=axes[1,0], kde=False ,bins=20)
sns.distplot(housing["NOX"],color="#216353",ax=axes[1, 1], kde=False,bins=20)
sns.distplot(housing["RM"], color="#FF8F00", ax=axes[1,2],kde=False ,bins=20)
sns.distplot(housing["AGE"], color="#33FF00", ax=axes[2, 0], kde=False,bins=20)
sns.distplot(housing["DIS"], color="#FF3300", ax=axes[2, 1], kde=False,bins=20)
sns.distplot(housing["RAD"], color="#cccc00", ax=axes[2, 2],kde=False,bins=20)
plt.show()
2.4.7.5小提琴图
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
iris = pd.read_csv('../iris.csv', names=names)
#创建一个新的图形窗口,并设置其大小为7x7英寸
plt.figure(figsize=(7,7))
#palette='Set2': 这设置了小提琴图的颜色方案,使用了名为'Set2'的调色板。
#dodge=False: 这个参数决定是否将小提琴图的边缘分开。设置为False表示不分开。
sns.violinplot(x="class", y="PetalWidthCm", data=iris,palette='Set2', dodge=False)
plt.show()
2.4.7.6箱线图
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
housing = pd.read_csv('../housing.csv')
"""
sns.boxplot(x=insurance.smoker, y=insurance.charges, orient=['no', 'yes']): 这行代码绘制了一个分组的箱线图,
展示了不同吸烟者类别('no'和'yes')下的健康保险费用分布情况。其中,x参数指定了分组依据的列(即吸烟者类别),
y参数指定了要展示的数据列(即健康保险费用),orient参数指定了分组的方向(这里设置为['no', 'yes'])。
"""
sns.boxplot(housing.B) #展示housing.csv中B列的箱线图
plt.show()
2.4.7.7散点图矩阵
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
iris = pd.read_csv('../iris.csv', names=names)
print(iris.head())
#从原始的 iris 数据集中筛选出包含 'Iris-setosa'、'Iris-versicolour' 和 'Iris-virginica' 类别的数据
iris1 = iris[iris['class'].isin(['Iris-setosa', 'Iris-versicolour', 'Iris-virginica'])]
sns.pairplot(iris1, hue='class', palette='husl', size=2) #size=2 设置了每个子图的大小
#vars=['SepalLengthCm','SepalWidthCm','PetalLengthCm']: 这个参数指定了要在散点图矩阵中展示的特征列
#height=3: 这个参数设置了每个子图的高度为 3。
#aspect=1: 这个参数设置了每个子图的宽高比为 1,即正方形。
sns.pairplot(iris1,hue='class',vars=['SepalLengthCm','SepalWidthCm','PetalLengthCm'],height=3, aspect=1)
plt.show()
2.4.7.8拟合回归线
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
iris = pd.read_csv('../iris.csv', names=names)
iris1 = iris[iris['class'].isin(['Iris-setosa', 'Iris-versicolour', 'Iris-virginica'])]
#marker='*': 这个参数指定了散点的标记符号)
sns.regplot(x=iris1.SepalLengthCm, y=iris1.SepalWidthCm, color='#FF6600', marker='*')
plt.show()
#logx=True: 这个参数指定了在 x 轴上使用对数刻度。
#回归线样式:'alpha' 设置了线条的透明度为 0.8,'lw' 设置了线条的宽度为 3。
#sns.lmplot(x='bmi',y='charges', hue='smoker', data=insurance, height=8, aspect=1.2)
#lmplot 是一个强大的工具,可用于快速分析和可视化两个变量之间的关系
sns.regplot(x=iris1.SepalLengthCm, y=iris1.SepalWidthCm, logx=True, line_kws={'color':'#FF5722', 'alpha':0.8, 'lw':3})
plt.show()
2.4.7.9联合分布图
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import warnings
from matplotlib import pyplot as plt
warnings.filterwarnings("ignore")
sns.set_style("white")
names = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'class']
iris = pd.read_csv('../iris.csv', names=names)
# kind='reg' 参数表示在图中添加一个回归线
# edgecolor='w'参数表示散点的边框颜色为白色。
# s=90参数表示散点的大小为90
# kind='hex'
sns.jointplot(x='SepalLengthCm', y='SepalWidthCm', data=iris, height=10, kind='reg', color='#FF6600')
plt.show()