如何使用Python Plotly创建子图?
在数据可视化和分析中,如果我们需要将多个图表展示在同一页上以进行比较和分析,那么使用子图是非常有帮助的。Python中的Plotly库提供了创建子图的便捷方法。
安装Plotly
我们可以使用pip命令来安装Plotly。在安装前请确保已安装pip,如果未安装可以使用以下命令来进行安装:
sudo apt-get install python-pip
然后运行以下命令来安装Plotly:
pip install plotly
创建多个子图
创建Plotly子图的方法类似于创建单个图表,我们需要创建一个包含布局信息和数据信息的字典。但是,我们需要在布局中指定子图的属性并将不同图表的数据分配给各自的子图。以下是几个例子:
例1:竖直排列的子图
import plotly.graph_objs as go
from plotly.subplots import make_subplots
fig = make_subplots(rows=2, cols=1)
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6], name="line 1")
trace2 = go.Scatter(x=[4, 5, 6], y=[7, 8, 9], name="line 2")
fig.add_trace(trace1, row=1, col=1)
fig.add_trace(trace2, row=2, col=1)
fig.show()
这将在一个画布上创建两个竖直排列的子图。rows=2
表示两行,cols=1
表示一列。此外,我们使用add_trace()
方法将每个trace分配到对应的子图上。
例2:水平排列的子图
fig = make_subplots(rows=1, cols=2)
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6], name="line 1")
trace2 = go.Scatter(x=[4, 5, 6], y=[7, 8, 9], name="line 2")
fig.add_trace(trace1, row=1, col=1)
fig.add_trace(trace2, row=1, col=2)
fig.show()
这将在一个画布上创建两个水平排列的子图。rows=1
表示一行,cols=2
表示两列。
例3:自定义排列的子图
fig = make_subplots(
rows=2, cols=2,
specs=[[{}, {"type": "bar"}],
[{"type": "scatter"}, {"type": "scatter"}]])
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6], name="line 1")
trace2 = go.Scatter(x=[4, 5, 6], y=[7, 8, 9], name="line 2")
trace3 = go.Bar(x=[1, 2, 3], y=[10, 11, 12], name="bar 1")
trace4 = go.Bar(x=[4, 5, 6], y=[13, 14, 15], name="bar 2")
fig.add_trace(trace1, row=1, col=1)
fig.add_trace(trace2, row=2, col=1)
fig.add_trace(trace3, row=1, col=2)
fig.add_trace(trace4, row=2, col=2)
fig.show()
这将在一个画布上创建4个子图:第一个是散点图,第二个是散点图,第三个是水平条形图,第四个是水平条形图。我们可以通过在specs中指定子图类型来自定义排列:[{}, {"type": "bar"}]
表示子图1(在行1,列1)是散点图,子图2(在行1,列2)是水平条形图。
绘制子图布局
除了上述的rows
和cols
参数外,我们还可以使用其他参数来自定义子图布局。以下是几个可用的参数:
specs
specs
是一个二维列表,可以指定子图的布局。例如,[[{}, {"type": "bar"}], [{"type": "scatter"}, {"type": "scatter"}]]
表示第一行有一个散点图和一个水平条形图,第二行有两个散点图。如果我们不想在该位置显示子图,则可以使用字典{"type": "none"}
。
shared_xaxes
和shared_yaxes
shared_xaxes
和shared_yaxes
分别指定是否共享x轴和y轴。例如,shared_xaxes=True
表示第一行的子图共享x轴,shared_yaxes=True
表示第一列的子图共享y轴。
vertical_spacing
和horizontal_spacing
vertical_spacing
和horizontal_spacing
是子图间的垂直和水平间距。vertical_spacing=0.1
表示子图之间的垂直间距为10%的高度,而horizontal_spacing=0.05
表示子图之间的水平间距为5%的宽度。
以下是一个示例代码,展示了如何使用这些参数自定义子图布局:
fig = make_subplots(
rows=2, cols=2,
specs=[[{}, {"type": "bar", "colspan": 2}], [{"type": "scatter"}, {"type": "scatter"}]],
shared_xaxes=True,
vertical_spacing=0.1,
horizontal_spacing=0.05
)
trace1 = go.Scatter(x=[1, 2, 3], y=[4, 5, 6], name="line 1")
trace2 = go.Scatter(x=[4, 5, 6], y=[7, 8, 9], name="line 2")
trace3 = go.Bar(x=[1, 2, 3], y=[10, 11, 12], name="bar 1")
trace4 = go.Bar(x=[4, 5, 6], y=[13, 14, 15], name="bar 2")
fig.add_trace(trace1, row=1, col=1)
fig.add_trace(trace2, row=1, col=2)
fig.add_trace(trace3, row=2, col=1)
fig.add_trace(trace4, row=2, col=2)
fig.show()
这将创建一个包含4个子图的画布。值得注意的是:
- 第一行有一个散点图和一个水平条形图(覆盖两列),因为我们指定了
colspan=2
。 - 第一行的子图共享x轴,因为我们使用了
shared_xaxes=True
。 - 使用了自定义的垂直和水平间距。
总结
使用Plotly库,我们可以方便地创建子图。我们可以使用make_subplots()
函数来创建基础布局,然后使用add_trace()
方法将不同类型的图表添加到不同的子图中。我们还可以使用其他属性来自定义子图布局,例如spec
、shared_xaxes
、shared_yaxes
、vertical_spacing
和horizontal_spacing
等。