<think>我们正在使用Plotly库来创建图表。根据用户的问题,他想知道如何在主图中添加子图。根据引用内容,Plotly提供了多种方式来实现子图,其中主要的方法是使用`make_subplots`函数(来自`plotly.subplots`模块)来创建子图布局,然后使用`add_trace`方法将各个图表添加到子图的指定位置。步骤:1.导入必要的模块:`make_subplots`和`plotly.graph_objects`(通常作为go导入)。2.使用`make_subplots`函数创建子图布局,指定行数和列数。3.使用`add_trace`方法添加每个子图的轨迹(trace),并指定该轨迹所在的行和列。4.可选的:设置整个图形的布局(如标题、尺寸等)。5.显示图形。另外,引用中提供了几种不同的示例,包括基本的子图创建、3D子图、双Y轴设置等。但用户的问题集中在如何添加子图,所以我们重点介绍基本方法。下面是一个具体的示例代码,展示如何创建一个包含两个子图(一个散点图和一个条形图)的主图:</think>### Plotly 如何在主图中添加子图
在 Plotly 中,通过 `make_subplots()` 函数可以实现在主图中创建子图布局。以下是具体实现步骤:
#### 1. **导入必要模块**
```python
from plotly.subplots import make_subplots
import plotly.graph_objects as go
```
#### 2. **创建子图布局**
使用 `make_subplots()` 定义子图的行列结构:
```python
fig = make_subplots(
rows=2, # 2行
cols=2, # 2列
subplot_titles=["子图1", "子图2", "子图3", "子图4"] # 子图标题
)
```
#### 3. **添加数据到指定子图**
通过 `add_trace()` 将图形对象添加到特定位置,用 `row` 和 `col` 参数定位:
```python
# 左上角子图(第1行第1列)
fig.add_trace(
go.Scatter(x=[1,2,3], y=[4,5,6]),
row=1, col=1
)
# 右下角子图(第2行第2列)
fig.add_trace(
go.Bar(x=["A","B"], y=[10,20]),
row=2, col=2
)
```
#### 4. **调整整体布局**
统一设置主图尺寸和标题:
```python
fig.update_layout(
height=600,
width=800,
title_text="多子图示例",
showlegend=True # 显示共享图例
)
```
#### 5. **高级功能**
- **共享坐标轴**:
在 `make_subplots()` 中添加 `shared_xaxes=True` 或 `shared_yaxes=True`
- **双Y轴子图**:
使用 `specs` 参数定义次级坐标轴[^4]:
```python
fig = make_subplots(
specs=[[{"secondary_y": True}, {}]] # 第1个子图启用双Y轴
)
```
- **混合图表类型**:
可在同一子图叠加多种图形(如折线图+柱状图)
#### 完整示例
```python
from plotly.subplots import make_subplots
import plotly.graph_objects as go
# 创建2x2子图布局
fig = make_subplots(rows=2, cols=2, subplot_titles=["散点图", "柱状图", "折线图", "混合图"])
# 添加子图数据
fig.add_trace(go.Scatter(x=[1,2,3], y=[4,1,2]), row=1, col=1)
fig.add_trace(go.Bar(x=["A","B","C"], y=[3,2,1]), row=1, col=2)
fig.add_trace(go.Scatter(x=[1,2,3], y=[2,3,1]), row=2, col=1)
fig.add_trace(go.Scatter(x=[1,2,3], y=[10,11,12]), row=2, col=2)
fig.add_trace(go.Bar(x=["A","B","C"], y=[12,11,10]), row=2, col=2) # 与折线图叠加
# 设置主图布局
fig.update_layout(height=700, width=900, title_text="复合子图示例")
fig.show()
```