可视化中如何做子图和母图
时间: 2024-12-21 11:31:38 浏览: 4
在可视化过程中,创建子图和母图通常是在制作复杂的图表布局时非常有用的技巧。例如,在Python的Matplotlib库中,你可以这样做:
1. **创建子图**:
- 使用`plt.subplot()`函数可以创建一个新的子图,它接受三元组作为参数,如`(rows, cols, index)`,表示行数、列数和子图位置。
- 比如 `plt.subplot(2, 2, 1)` 将创建一个2x2网格的第1个子图。
2. **设置母图**:
- 如果你想在整个工作流程中保持一些共享的属性,比如标题、坐标轴标签等,可以在绘制所有子图之前先创建一个`Figure`对象,然后给所有的子图加上这个`Figure`。
- ```python
fig = plt.figure()
ax1 = fig.add_subplot(121) # 子图1
ax2 = fig.add_subplot(122) # 子图2
```
3. **调整子图间的关系**:
- 使用`fig.add_subplot_adjust()`可以调整子图之间的间距和大小,保持整体布局美观。
- 或者使用`subplots_adjust()`方法调整特定子图的位置。
4. **显示子图**:
- 最后通过`plt.show()`将整个图形展示出来。
相关问题
bi大数据可视化图表制作中,怎么制作子图和母图
在大数据可视化中,制作子图和母图通常是在数据集较大或需要展示多个独立视角的情况下。这里以Python库如Matplotlib、Seaborn或Plotly等为例:
**母图(主图)**:
1. 首先创建一个大的画布,这可以视为母图。你可以使用`plt.figure()`函数来创建一个新的图形窗口。
```python
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 6)) # 创建一个宽度为10英寸,高度为6英寸的画布
```
2. 在这个画布上添加各种元素,例如线图、柱状图等。
**子图(嵌套图)**:
1. 使用`add_subplot()`或`subplots()`方法可以在母图上创建子区域作为单独的小图,每个子区域就是一个子图。
```python
# 如果你想创建2行3列的子图网格
grid = fig.subplots(nrows=2, ncols=3)
# 或者指定特定的位置
ax1 = fig.add_subplot(2, 2, 1) # 第一格子
ax2 = fig.add_subplot(2, 2, 2) # 第二格子
ax3 = fig.add_subplot(2, 2, 3) # 第三格子
ax4 = fig.add_subplot(2, 2, 4) # 第四格子
```
2. 对于每个子图,你可以分别绘制数据,并设置各自的标题和标签。
**相关问题--:**
1. Matplotlib和Seaborn中如何控制子图之间的间距?
2. 如何在Python中动态调整子图的数量?
3. 子图共享x轴或y轴的设置方法是什么?
其中Stkcd为股票代码,Accper为截止日期,F090301B为归属于母公司每股收益,F090601B为每股营业收入,F091001A为每股净资产,F091301A为每股资本公积,F091501A为每股未分配利润,F091801B为每股经营活动产生的现金流量净额。问题如下: (1)对每个股票代码,计算每个季度每股收益同比增长率,并找出连续4个季度每股收益同比增长率大于20%的股票代码。 (2)找出2017年、2018年每股资本公积和每股未分配利润最大的10只股票代码,并通过柱状图、子图的方法可视化展现出来。 (3)取2018年的数据,对以上6个指标做主成分分析,要求提取信息占比在95%以上,并写出每个主成分的表达式,说明其主成分的意义。 (4)基于第3步提取的主成分进行K-均值聚类分析,并获取聚类中心
以下是针对您的问题的Python代码实现:
(1)对每个股票代码,计算每个季度每股收益同比增长率,并找出连续4个季度每股收益同比增长率大于20%的股票代码。
```python
import pandas as pd
# 读取数据
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 计算每个季度每股收益同比增长率
df['EPS_Growth_Rate'] = df.groupby('Stkcd')['F090301B'].pct_change(periods=4) * 100
# 找出符合条件的股票代码
result = df[df.groupby('Stkcd')['EPS_Growth_Rate'].apply(lambda x: x.rolling(4, min_periods=4).mean().ge(20)).values]
result = result['Stkcd'].unique().tolist()
print(result)
```
(2)找出2017年、2018年每股资本公积和每股未分配利润最大的10只股票代码,并通过柱状图、子图的方法可视化展现出来。
```python
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 筛选出2017年、2018年的数据
df = df[df['Accper'].dt.year.isin([2017, 2018])]
# 找出每股资本公积和每股未分配利润最大的10只股票代码
result = df.groupby('Stkcd')['F091301A', 'F091501A'].sum()
result = result.nlargest(10, ['F091301A', 'F091501A'])
# 可视化展示
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
result['F091301A'].plot(kind='bar', ax=axes[0])
result['F091501A'].plot(kind='bar', ax=axes[1])
axes[0].set_title('Top 10 Stocks by Capital Reserve')
axes[1].set_title('Top 10 Stocks by Retained Earnings')
plt.show()
```
(3)取2018年的数据,对以上6个指标做主成分分析,要求提取信息占比在95%以上,并写出每个主成分的表达式,说明其主成分的意义。
```python
import pandas as pd
from sklearn.decomposition import PCA
# 读取数据
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 筛选出2018年的数据
df = df[df['Accper'].dt.year == 2018]
# 提取需要进行主成分分析的指标
cols = ['F090301B', 'F090601B', 'F091001A', 'F091301A', 'F091501A', 'F091801B']
data = df[cols]
# 主成分分析
pca = PCA(n_components=0.95)
pca.fit(data)
# 输出每个主成分的表达式和意义
for i in range(pca.n_components_):
print(f'PC{i+1} = {pca.components_[i][0]:.2f}*F090301B + {pca.components_[i][1]:.2f}*F090601B + '
f'{pca.components_[i][2]:.2f}*F091001A + {pca.components_[i][3]:.2f}*F091301A + '
f'{pca.components_[i][4]:.2f}*F091501A + {pca.components_[i][5]:.2f}*F091801B')
print(f'The meaning of PC{i+1} is {pca.explained_variance_ratio_[i]*100:.2f}% of the total variance.')
```
(4)基于第3步提取的主成分进行K-均值聚类分析,并获取聚类中心。
```python
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
# 读取数据
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 筛选出2018年的数据
df = df[df['Accper'].dt.year == 2018]
# 提取需要进行主成分分析的指标
cols = ['F090301B', 'F090601B', 'F091001A', 'F091301A', 'F091501A', 'F091801B']
data = df[cols]
# 主成分分析
pca = PCA(n_components=0.95)
pca.fit(data)
data_pca = pca.transform(data)
# K-均值聚类分析
kmeans = KMeans(n_clusters=3, random_state=0).fit(data_pca)
# 获取聚类中心
centers = pca.inverse_transform(kmeans.cluster_centers_)
centers = pd.DataFrame(centers, columns=cols)
print(centers)
```
阅读全文