一、统计特征图绘制
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')
三、降维分析
1.需求
我现在有两个数据集Pdata和Cdata分别在DataFrame对象中,但是这两个数据集有很多通道(变量),不利于做整体可视化分析,我需要将这两个数据降维到二维,然后利用散点图观察他们的分布特性
2.PCA降维代码
# 将两个数据集合并
combined_df = pd.concat([Pdata, Cdata], axis=0)
# 创建一个 PCA 模型,设置主成分个数为 2
pca = PCA(n_components=2)
# 对合并后的数据集进行主成分分析
pca_result = pca.fit_transform(combined_df)
# 将转换后的数据分开
pca_df1 = pd.DataFrame(pca_result[:len(data_to_analyze)], columns=['PC1', 'PC2',])
pca_df2 = pd.DataFrame(pca_result[len(data_to_analyze):], columns=['PC1', 'PC2',])
# 绘制散点图
plt.figure(figsize=(19, 10))
plt.scatter(pca_df1['PC1'], pca_df1['PC2'], label='pattern', color='blue', marker='o', alpha=0.3)
plt.scatter(pca_df2['PC1'], pca_df2['PC2'], label='both', color='red', marker='x', alpha=0.3)
# 设置坐标轴标签
plt.xlabel('X Label')
plt.ylabel('Y Label')
plt.legend()
plt.title('PCA Visualization')
plt.savefig('pca.png')
3.t-SNE降维代码
combined_df = pd.concat([data_to_analyze, correct_to_analyze, error_to_analyze], axis=0)
tsne = TSNE(n_components=2)
tsne_result = tsne.fit_transform(combined_df)
# 将转换后的数据分开
tsne_df1 = pd.DataFrame(tsne_result[:len(data_to_analyze)], columns=['TSNE1', 'TSNE2'])
tsne_df2 = pd.DataFrame(tsne_result[len(data_to_analyze):len(data_to_analyze)+len(correct_to_analyze)], columns=['TSNE1', 'TSNE2'])
tsne_df3 = pd.DataFrame(tsne_result[len(data_to_analyze)+len(correct_to_analyze):], columns=['TSNE1', 'TSNE2'])
# 绘制散点图
plt.figure(figsize=(19, 10))
plt.scatter(tsne_df1['TSNE1'], tsne_df1['TSNE2'], label='pattern', marker='o')
plt.scatter(tsne_df2['TSNE1'], tsne_df2['TSNE2'], label='both', marker='x', alpha=0.4)
plt.scatter(tsne_df3['TSNE1'], tsne_df3['TSNE2'], label='error', marker='*', alpha=0.1)
# 设置坐标轴标签
plt.xlabel('X Label')
plt.ylabel('Y Label')
plt.legend()
plt.title('t-SNE Visualization')
plt.savefig('tsne.png')