文章目录
- 一、统计特征图绘制
- 1.需求
- 2.代码
- 方法一
- 方法二
- 总结
- 二、分布特征图绘制
- 1.需求
- 2.代码
一、统计特征图绘制
1.需求
我现在有两个数据集Pdata和Cdata分别在DataFrame对象中,我现在想对这两个数据集进行统计特征分析,并用直方图展示出来。
2.代码
方法一
# 查看提取数据的统计特征
p1 = Pdata.describe()
c1 = Cdata.describe()
# 绘制指标
metrics = ['mean', 'std', '25%', '50%', '75%']
# 创建一个包含3行和2列的子图布局,每个子图的大小为 (20, 12)
# 这里的axes是一个3×2的数组,里面存放的是Axes对象,可以理解为画布上的一块区域,您可以在这个区域上绘制各种图形
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(20, 12))
for i, metric in enumerate(metrics):
row = i // 2
col = i % 2
# 绘制出p1的一个条形图
# 第一个参数:柱子在x轴上的坐标,即每个条形图的横坐标位置,类数组结构。
# 第二个参数:柱子的高度,即每个条形图的高度,类数组结构。
# width=0.4控制柱状图的宽度,alpha=0.7控制柱状图的透明度。
axes[row, col].bar(range(len(p1.columns)), p1.loc[metric], width=0.4, label='p1', alpha=0.7)
# 绘制出c1的一个条形图,为了避免两组柱状图重叠,我们将第二组柱状图的位置平移了0.4个单位
axes[row, col].bar([j + 0.4 for j in range(len(c1.columns))], c1.loc[metric], width=0.4, label='c1', alpha=0.7)
# 设置 x 轴刻度的位置
axes[row, col].set_xticks([j + 0.2 for j in range(len(p1.columns))])
# 设置x轴的刻度标签,进行了45度旋转和右对齐
axes[row, col].set_xticklabels(range(1, len(p1.columns) + 1), rotation=45, ha='right')
# 添加图例
axes[row, col].legend()
axes[row, col].set_title(metric)
# 自动调整子图布局,使它们适应整个图形区域,同时避免重叠和裁剪
plt.tight_layout()
plt.savefig('metrics.png')
方法二
metrics = ['mean', 'std', '25%', '50%', '75%']
# 创建一个新的空白画布
plt.figure(figsize=(19, 10))
for i, metric in enumerate(metrics):
# 在当前画布中创建一个子图,3行2列的布局,当前子图的位置由 i+1 指定
plt.subplot(3, 2, i + 1)
plt.bar(range(len(p1.columns)), p1.loc[metric], width=0.4, label='p1', alpha=0.7)
plt.bar([j + 0.4 for j in range(len(c1.columns))], c1.loc[metric], width=0.4, label='c1', alpha=0.7)
plt.xticks(ticks=[j + 0.2 for j in range(len(p1.columns))], labels=range(1, len(p1.columns) + 1), rotation=45, ha='right')
plt.legend()
plt.title(metric)
plt.tight_layout()
plt.savefig('metrics.png')
总结
这两种方法都可以用来画子图,但它们的使用方式略有不同,适用于不同的情况:
-
方法一
- 这种方式是一次性创建一个包含多个子图的画布,并返回一个包含所有子图的Axes对象数组。
- 这种方法适合需要同时处理多个子图的情况,可以更方便地对所有子图进行操作,例如调整子图之间的间距、设置共享轴等。
-
方法二
- 这种方式是先创建一个空白画布,然后在循环中逐个添加子图。
- 这种方法适合需要在每个子图之间进行个性化设置或处理的情况,例如设置不同子图的标题、颜色等。
总体来说,方法一适用于需要创建多个子图且希望一次性处理它们的情况,而方法二适用于需要逐个处理子图或对子图进行个性化设置的情况。
二、分布特征图绘制
1.需求
我现在有两个数据集Pdata和Cdata分别在DataFrame对象中,我现在想对这两个数据集进行分布特征分析,即各个数据段的密度分析,并用直方图展示出来。
2.代码
cols_to_plot1 = ['feature_0', 'feature_1', 'feature_2', 'feature_3', 'feature_4', 'feature_5', 'feature_6', 'feature_7', 'feature_8']
plt.figure(figsize=(19, 10))
for i, col in enumerate(cols_to_plot1):
plt.subplot(3, 3, i+1)
# 绘制数据的分布情况,bins指定了直方图的箱数,stat='density'参数用于指定绘制的统计信息是归一化的密度而不是数量
sns.histplot(Pdata[col], bins=15, label='p1', stat='density')
sns.histplot(Cdata[col], bins=15, label='c1', stat='density')
plt.legend()
plt.tight_layout()
plt.savefig('feature.png')