【python】绘图代码模板
- pandas.DataFrame.plot( )画图函数
- Seaborn绘图 -数据可视化必备
- 导入数据集
- 可视化统计关系
- 使用Seaborn绘制散点图
- 抖动图
- 箱线图
- 小提琴图
- Pointplot
- 群图
- 可视化数据集的分布
- 绘制单变量分布
- 柱状图
- 直方图
- 绘制双变量分布
- Hex图
- KDE 图
- 可视化数据集中的成对关系
- 好看的图模板
- 来自宽格式数据集的线图
- 带观察值的水平箱线图
- 多个面上的线图
- 具有多种语义的散点图
pandas.DataFrame.plot( )画图函数
DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False,
sharex=None, sharey=False, layout=None,figsize=None,
use_index=True, title=None, grid=None, legend=True,
style=None, logx=False, logy=False, loglog=False,
xticks=None, yticks=None, xlim=None, ylim=None, rot=None,
xerr=None,secondary_y=False, sort_columns=False, **kwds)
以下是DataFrame.plot()
方法的参数以及它们的作用和可选值:
-
x
:横轴的列名或位置索引,用于指定绘图时使用的横轴数据。 -
y
:纵轴的列名或位置索引,用于指定绘图时使用的纵轴数据。 -
kind
:绘图类型,可以是以下选项:'line'
:折线图'bar'
:垂直条形图'barh'
:水平条形图'hist'
:直方图'box'
:箱线图'kde'
:核密度估计图'density'
:与'kde'
相同'area'
:面积图'pie'
:饼图'scatter'
:散点图'hexbin'
:六边形散点图
-
ax
:Matplotlib Axes对象,用于在已有的图形上添加新的图层。 -
subplots
:布尔值,如果为True,则为每个列绘制单独的子图。 -
sharex
:布尔值,如果subplots为True,则共享x轴。 -
sharey
:布尔值,如果subplots为True,则共享y轴。 -
layout
:元组,用于指定子图的行列布局。 -
figsize
:元组,图形的尺寸,以英寸为单位。 -
use_index
:布尔值,默认为True,使用行索引作为x轴。 -
title
:字符串,图形的标题。 -
grid
:布尔值,控制是否显示网格线。 -
legend
:布尔值或者字符串’reverse’,控制是否显示图例。 -
style
:列表或字典,用于指定每列折线图的线条样式。 -
logx
:布尔值,是否使用对数坐标轴(x轴)。 -
logy
:布尔值,是否使用对数坐标轴(y轴)。 -
loglog
:布尔值,是否同时使用对数坐标轴(x轴和y轴)。 -
xticks
:序列,用于自定义x轴刻度值。 -
yticks
:序列,用于自定义y轴刻度值。 -
xlim
:列表或元组,自定义x轴显示范围。 -
ylim
:列表或元组,自定义y轴显示范围。 -
rot
:整数,设置刻度标签的旋转角度。 -
fontsize
:整数,设置刻度标签的字体大小。 -
colormap
:字符串或Matplotlib colormap对象,默认为None,用于选择图的区域颜色。 -
colorbar
:布尔值,如果为True,则在柱状图和散点图上添加颜色条。 -
position
:浮点数,用于指定条形图布局的相对对齐位置(0表示左端/底端,1表示右端/顶端)。 -
table
:布尔值、Series或DataFrame,默认为False,如果为True,则根据DataFrame的数据绘制表格。 -
yerr
和xerr
:DataFrame、Series、数组或字典,用于绘制带有误差条的图表(详情请参考绘图带有误差条的方法)。 -
stacked
:布尔值,在折线图和柱状图中默认为False,在面积图中默认为True,用于创建堆叠图。 -
sort_columns
:布尔值,默认为False,以字母表顺序绘制各列,默认使用前列顺序。 -
secondary_y
:布尔值或序列,默认为False,是否在右侧添加第二个y轴。如果是序列,指定要在右侧绘制的列。 -
mark_right
:布尔值,默认为True,当使用第二个y轴时,是否自动在图例中标记列标签为"(right)"。 -
**kwds
:其他传递给Matplotlib绘图方法的关键字参数。
返回值:
axes
:Matplotlib AxesSubplot对象或其数组。
示例:
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {
'Year': [2015, 2016, 2017, 2018, 2019, 2020, 2021],
'Sales': [100, 120, 150, 180, 200, 230, 250],
'Expenses': [80, 90, 100, 110, 120, 130, 140]
}
df = pd.DataFrame(data)
# 绘制折线图
df.plot(x='Year', y=['Sales', 'Expenses'], kind='line', marker='o', linewidth=2)
plt.title('Sales and Expenses Over Years')
plt.xlabel('Year')
plt.ylabel('Amount (in thousands)')
plt.grid(True)
plt.legend(['Sales', 'Expenses'])
plt.show()
# 绘制条形图
df.plot(x='Year', y=['Sales', 'Expenses'], kind='bar', alpha=0.7)
plt.title('Sales and Expenses Over Years')
plt.xlabel('Year')
plt.ylabel('Amount (in thousands)')
plt.grid(axis='y')
plt.legend(['Sales', 'Expenses'])
plt.show()
Seaborn绘图 -数据可视化必备
官方示例:https://seaborn.pydata.org/tutorial.html
Seaborn是一个构建在matplotlib之上的一个非常完美的Python可视化库。
与Matplotlib的低级接口相比,Seaborn具有高级接口。适合处理数据流
需要导入的包
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from scipy import stats
导入数据集
数据来源:https://datahack.analyticsvidhya.com/contest/enigmacodefestmachinelearning1/
df = pd.read_csv(r"train_NIR5Yl1.csv")
df.head()
可视化统计关系
使用Seaborn绘制散点图
散点图可以可视化两个变量之间的关系。每个点在数据集中显示一个观察值,这些观察值用点状结构表示。图中显示了两个变量的联合分布。
# 创建图形和轴
sns.relplot(x="Views", y="Upvotes", data = df)
显示与数据相关的标签
sns.relplot(x="Views", y="Upvotes", hue = "Tag", data = df)
# 另外还可以通过参数size = "Tag"或者数size=(15,200)。,改变点大小
另外可以在色调(Hue)的帮助下在我们的图片中添加另一个维度,通过为点赋予颜色来实现,每种颜色都有一些附加的意义。
sns.relplot(x="Views", y="Upvotes", hue = "Answers", data = df);
抖动图
使用的数据来源:https://datahack.analyticsvidhya.com/contest/wnsanalyticshackathon20181/
使用catplot()函数查看education列和avg_training_score列之间的关系
sns.catplot(x="education", y="avg_training_score", jitter = False, data=df2)
在Seaborn的catplot
函数中,jitter
参数控制是否对数据点进行抖动(jittering)。抖动是在分类变量上添加一些随机的小偏移量,使得数据点在x轴上稍微分散,从而防止多个数据点重叠在同一个位置,增加可视化的可读性。
-
jitter=True
:表示在x轴上对数据进行抖动。这样做可以有效避免数据点的重叠,特别是当数据较密集时,使得图表更易于观察和解读。 -
jitter=False
:表示不对数据进行抖动。如果你的数据不太密集,或者你更关心各个数据点的精确位置,可以选择这个选项。
选择是否使用抖动取决于数据的特点和你想要达到的可视化效果。对于大多数情况下,启用抖动是一个好的选择,因为它可以帮助更好地展示数据的分布情况。然而,如果你的数据较少或者有特定需求,可以将jitter
设置为False
。
Hue图
接下来,如果我们想在我们的图中引入另一个变量或另一个维度,我们可以使用hue参数。假设我们希望看到教育和avg_training_score图中的性别分布
sns.catplot(x="education", y="avg_training_score", hue = "gender", data=df2)
在上面的图中,一些点是相互重叠的,为了消除这种情况,可以设置kind =
“swarm”, swarm使用一种算法来防止这些点重叠,并且沿着分类轴调整这些点。
sns.catplot(x="education", y="avg_training_score", kind = "swarm", data=df2)
将is_promoted作为一个新变量引入
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "swarm", data=df2)
箱线图
箱线图 ,它显示了分布的三个四分位值以及最终值。箱图中的每个值都对应于数据中的实际观察值
sns.catplot(x="education", y="avg_training_score", kind = "box", data=df2)
小提琴图
小提琴图结合了箱线图和核密度估计程序,以提供更丰富的值分布描述。四分位数值显示在小提琴内部。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin", data=df2)
当色调语义参数是二值时,我们还可以拆分小提琴,这也可能有助于节省绘图空间。
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "violin",split=True, data=df2)
Pointplot
pointplot,这个图指出估计值和置信区间。Pointplot连接来自相同色调类别的数据。这有助于识别特定色调类别中的关系如何变化
sns.catplot(x="education", y="avg_training_score", hue = "is_promoted", kind = "point", data=df2)
群图
sns.catplot(x="education", # x轴上的分类变量,这里是教育程度
y="avg_training_score", # y轴上的数值变量,这里是平均培训分数
hue="is_promoted", # 按照是否晋升(is_promoted)来给数据点着色
col="gender", # 按照性别(gender)分列绘制图表
aspect=.9, # 控制每个绘图块(facet)的纵横比例
kind="swarm", # 指定绘图类型为分类散点图(swarm plot)
data=df2) # 数据来源,这里是一个DataFrame df2
可视化数据集的分布
绘制单变量分布
柱状图
在研究变量分布时,最常见的是柱状图。默认情况下,distplot()函数绘制柱状图并适合内核密度估计
sns.distplot(df2.age)
直方图
直方图以箱子的形式表示数据的分布,并使用条形图来显示每个箱子下的观察次数。我们还可以在其中添加一个加固图,而不是使用KDE(核密度估计),这意味着在每次观察时,它都会画一个小的垂直标尺。
sns.distplot(df2.age, kde=False, rug = True)
绘制双变量分布
使用了seaborn库的jointplot()函数。默认情况下,jointplot绘制散点图。
sns.jointplot(x="avg_training_score", y="age", data=df2);
Hex图
Hexplot是一个双变量的直方图,因为它显示了在六边形区域内的观察次数。这是一个非常容易处理大数据集的图。为了绘制Hexplot,我们将把kind属性设置为hex
sns.jointplot(x=df2.age, y=df2.avg_training_score, kind="hex", data = df2)
KDE 图
sns.jointplot(x="age", y="avg_training_score", data=df2, kind="kde");
可视化数据集中的成对关系
sns.pairplot(df2)
好看的图模板
来自宽格式数据集的线图
# 导入必要的库
import numpy as np
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid") # 设置Seaborn绘图的主题和样式
# 创建一个随机种子,以便结果可以复现
rs = np.random.RandomState(365)
# 生成一个包含随机数据的数组,形状为(365, 4),并计算每一列的累积和
values = rs.randn(365, 4).cumsum(axis=0)
# 创建日期范围为2016年1月1日起的365个日期,间隔为1天
dates = pd.date_range("1 1 2016", periods=365, freq="D")
# 使用Pandas将数据和日期合并为DataFrame,并给每列指定名称"A", "B", "C", "D"
data = pd.DataFrame(values, dates, columns=["A", "B", "C", "D"])
# 使用滚动窗口计算每列的7天滚动均值,并更新数据
data = data.rolling(7).mean()
# 使用Seaborn绘制折线图,展示数据中每列的变化趋势
sns.lineplot(data=data, palette="tab10", linewidth=2.5)
带观察值的水平箱线图
数据来源:https://github.com/mwaskom/seaborn-data/blob/master/planets.csv
# 导入所需的库
import seaborn as sns
import matplotlib.pyplot as plt
# 设置seaborn的主题样式为'ticks'
sns.set_theme(style="ticks")
# 初始化图表,大小为(7,6),并设置x轴为对数刻度
f, ax = plt.subplots(figsize=(7, 6))
ax.set_xscale("log")
# 载入seaborn内置的'planets'数据集
planets = pd.read_csv(r"planets.csv")
# 使用箱形图绘制'distance'为x轴,'method'为y轴
# 设置whis可显示异常值的范围,width调整箱形的宽度
# 使用'vlag'色阶
sns.boxplot(x="distance", y="method", data=planets,
whis=[0, 100], width=.6, palette="vlag")
# 使用散点图绘制'distance'为x轴,'method'为y轴
# 设置点的大小,颜色和线宽
sns.stripplot(x="distance", y="method", data=planets,
size=4, color=".3", linewidth=0)
# 数据可视化美化
# 显示x轴网格线,移除y轴标签,裁剪左边边框
ax.xaxis.grid(True)
ax.set(ylabel="")
sns.despine(trim=True, left=True)
# 显示图表
plt.show()
多个面上的线图
import seaborn as sns
# 设置seaborn主题样式为'ticks'
sns.set_theme(style="ticks")
# 加载'sdots'示例数据集
dots = sns.load_dataset("dots")
# 定义调色板的具体颜色值
palette = sns.color_palette("rocket_r")
# 绘制两面多个线图
# x轴为'time',y轴为'firing_rate'
# hue表示颜色区分的变量'coherence'
# size表示点的大小代表的变量'choice'
# col表示按'slign'分面
# kind指定折线图类型
# size_order设置点的大小顺序
# palette定义上面指定的调色板
# height/aspect设置图形大小,facet_kws定义分面参数
sns.relplot(data=dots,
x="time", y="firing_rate",
hue="coherence", size="choice", col="align",
kind="line", size_order=["T1", "T2"], palette=palette,
height=5, aspect=.75, facet_kws=dict(sharex=False))
# 该图的作用是:
# 使用线图展示'dots'数据集中
# 'time','firing_rate'两个变量的关系
# 并利用颜色、点大小、分面等视觉编码显示不同的第三维和第四维信息
# 直观呈现多维数据集的关系
具有多种语义的散点图
import seaborn as sns
import matplotlib.pyplot as plt
# 设置seaborn主题样式为白色网格
sns.set_theme(style="whitegrid")
# 加载内置的钻石数据集
diamonds = sns.load_dataset("diamonds")
# 初始化图像和子图,并移除子图边框
f, ax = plt.subplots(figsize=(6.5, 6.5))
sns.despine(f, left=True, bottom=True)
# 定义钻石clarity的排序
clarity_ranking = ["I1", "SI2", "SI1", "VS2", "VS1", "VVS2", "VVS1", "IF"]
# 绘制散点图
# x轴为carat,y轴为price
# hue为clarity,即颜色区分clarity
# size为depth,即点的大小代表depth
# palette定义颜色渐变
# hue_order指定上面定义的clarity顺序
# sizes设置点的大小范围
# data和ax指定所用的数据及子图
sns.scatterplot(x="carat", y="price",
hue="clarity", size="depth",
palette="ch:r=-.2,d=.3_r",
hue_order=clarity_ranking,
sizes=(1, 8), linewidth=0,
data=diamonds, ax=ax)
# 这是一个组合了多个变量的散点图
# 既展示了carat与price的关系
# 又通过颜色和大小编码呈现了clarity和depth维度的信息
# 可以更清晰地呈现钻石数据集的多维分布情况