Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер
Артефакт визуализации Plotly играет с рисованием нескольких подграфов
Всем привет, меня зовут Питер~
Давно не было статьи о рисовании Plotly.Я уже рассказывал, как рисовать гистограммы, круговые диаграммы, диаграммы скрипки, диаграммы Санки и т. д. Сегодня я представляю вам статью о том, как Plotly рисует несколько подграфов на холсте Как осуществлять нанесение различных видов графики.
Сюжетно сериализованные статьи
Рисунок с несколькими подграфами
Сначала посмотрите на фактический эффект:
В Plotly есть два способа рисовать подграфики, основанные на plotly_express и graph_objects.
Но plotly_express поддерживает только facet_plots и подграфики маргинального распределения, а только graph_objects, основанные на модуле make_subplots, могут рисовать настоящие мультиподграфики. Далее поясняется на практических примерах.
import pandas as pd
import numpy as np
import plotly_express as px
import plotly.graph_objects as go
# 绘制子图
from plotly.subplots import make_subplots
Самое главное — импортировать модуль make_subplots.
На основе plotly_express
plotly_express рисует «подграфики», передавая параметрыmarginal_x
иmarginal_y
Для реализации указывает тип графика на полях, который может быть «гистограмма», «коврик», «ящик» или «скрипка».
на основе facet_plots
График срезов — это график, состоящий из нескольких подграфиков с одним и тем же набором осей, где каждый подграфик показывает подмножество данных, также известное как решетчатые графики или небольшие множители. Кажется более подходящим перейти непосредственно к официальному английскому языку, но я пока не могу найти более подходящий китайский перевод.
Отображение различных графических фрагментов
Сначала импортируйте встроенный набор данных о потреблении:
1. Графики в разрезе на основе точечных диаграмм
fig = px.scatter(tips, # 数据
x="total_bill", # xy轴
y="tip",
color="smoker", # 颜色
facet_col="day" # 列方向切面字段
)
fig.show()
2. Отображение раздела на основе гистограммы
# 2、柱状图切面
fig = px.bar(tips,
x="size",
y="total_bill",
color="day",
facet_row="smoker" # 行方向切面字段:是否抽烟
)
fig.show()
Контролируйте количество подграфов
3, обтекание столбца Фасеты: управление представлением фрагмента количества элементов отображения
Когда значение поля фасета, которое мы указываем, имеет много разных ситуаций, мы можем использовать параметр facet_col_wrap для управления максимальным количеством графики, отображаемой в каждой строке.Обтекание можно понимать как: значение ограничения состоит в том, что каждая строка ограничено отображением Сколько.
Используя встроенный набор данных GDP:
# 3、被限制每行图形个数的切面图
fig = px.scatter(gdp, # 数据集
x='gdpPercap', # x、y、颜色、点的大小size
y='lifeExp',
color='continent',
size='pop',
facet_col='continent', # 列切面字段
facet_col_wrap=3 # 每行最多3个图形
)
fig.show()
Поле столбца графа срезов выше — это континенты, а континентов не более 5. Следующий график выбирает время года:
fig = px.scatter(gdp, # 数据集
x='gdpPercap', # x、y、颜色、点的大小size
y='lifeExp',
color='continent',
size='pop',
facet_col='year', # 列切面字段
facet_col_wrap=3 # 每行最多3个图形
)
fig.show()
Отображение до 4 графиков в строке:
fig = px.scatter(gdp,
x='gdpPercap',
y='lifeExp',
color='continent',
size='pop',
facet_col='year',
facet_col_wrap=4 # 每行最多4个图形
)
fig.show()
Настройки оси подграфика
По умолчанию ось Y подграфиков одинакова:
# 独立轴的切面:默认情况是相同的y轴
# 默认下y轴的取值范围相同
fig = px.scatter(tips,
x="total_bill",
y="tip",
color='day',
facet_row="time"
)
fig.show()
Не разделяйте ось Y с помощью настройки параметра:
fig = px.scatter(tips,
x="total_bill",
y="tip",
color='day',
facet_row="time" # 列方向上切面图
)
# 设置不共享y轴,对应的是facet_row
fig.update_yaxes(matches=None)
fig.show()
Если это facet_col в направлении столбца, вы можете установить ось X, которая не будет использоваться совместно.
fig = px.scatter(tips,
x="total_bill",
y="tip",
color='day',
facet_col="time" # 列方向上切面图
)
# 设置不共享x轴,对应的是facet_col
fig.update_xaxes(matches=None)
fig.show()
Настройки заголовка подсюжета
fig = px.scatter(tips,
x="total_bill",
y="tip",
color="time",
facet_col="smoker"
)
fig.show()
Измените заголовок подзаголовка, установив:
fig = px.scatter(tips,
x="total_bill",
y="tip",
color="time",
facet_col="smoker"
)
# 增加代码:对每行标题通过=切割,取出最后的元素
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))
fig.show()
Маржинальный на основе маргинального графа
Этот метод в основном реализуется через marginal_x и marginal_y. Сначала импортируйте набор данных:
Маргинальные графы на основе разных графов
1. По точечной диаграмме:
fig = px.scatter(iris, # 数据集
x="sepal_length", # 指定xy轴
y="sepal_width",
marginal_x="rug", # 边际图形类型:直方图
marginal_y="histogram" # 轴须图
)
fig.show()
2. Предельные настройки графики на основе тепловых карт плотности:
fig = px.density_heatmap(
iris, # 数据
x="sepal_width", # 两个轴
y="sepal_length",
marginal_x="violin", # 边际图:小提琴和箱型图
marginal_y="box")
fig.show()
3. Настройки цвета маргинальной карты
fig = px.scatter(iris,
x="sepal_length",
y="sepal_width",
color="species", # 颜色的设置同样适用于边际图
marginal_x="violin",
marginal_y="box",
title="边际图颜色设置")
fig.show()
Маргинальные графы и графы срезов используются вместе
fig = px.scatter(
tips,
x="total_bill",
y="tip",
color="sex",
facet_col="day", # 日期字段切面
marginal_x="violin" # 边际图用小提琴图
)
fig.show()
на основе graph_objects
Фактически метод graph_objects реализован функцией make_subplots. Обязательно сначала импортируйте:
# 这种方式一定要导入的模块
from plotly.subplots import make_subplots
import plotly.graph_objects as go
базовый подграф
# 两个基本参数:设置行、列
fig = make_subplots(rows=1, cols=2) # 1行2列
# 添加两个数据轨迹,构成两个图形
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[5, 10, 15]),
row=1, col=1 # 第一行第一列
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[60, 70, 80]),
row=1, col=2 # 第一行第二列
)
# 设置图形的宽高和标题
fig.update_layout(height=600,
width=800,
title_text="子图制作")
fig.show()
fig = make_subplots(rows=3, cols=1) # 3行1列
# 添加3个数据轨迹
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[5, 10, 15]),
row=1, col=1 # 1*1
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[60, 70, 80]),
row=2, col=1 # 2*1
)
fig.add_trace(
go.Scatter(x=[50, 60, 70], y=[110, 120, 130]),
row=3, col=1 # 3*1
)
fig.update_layout(height=600,
width=800,
title_text="子图制作")
fig.show()
Многострочный многостолбцовый подграф
Когда имеется несколько строк и несколько столбцов, мы можем указать положение первого изображения, указав, где оно начинается. Верхний левый угол по умолчанию — это позиция первого изображения.
\fig = make_subplots(rows=2, cols=2,# 2行2列
start_cell="bottom-left"# 第一个图形的位置,两个选择:bottom-left', 'top-left
)
# 添加4个数据轨迹
fig.add_trace(
go.Bar(x=[1, 2, 3], y=[5, 10, 15]),
row=1, col=1 # 1*1
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[60, 70, 80]),
row=1, col=2 # 1*2
)
fig.add_trace(
go.Scatter(x=[50, 60, 70], y=[110, 120, 130]),
row=2, col=1 # 2*1
)
fig.add_trace(
go.Bar(x=[50, 60, 70], y=[110, 120, 130]),
row=2, col=2 # 2*2
)
fig.update_layout(height=600,
width=800,
title_text="子图制作")
fig.show()
Настройки заголовка с несколькими сюжетными линиями
Много раз нам приходилось называть каждый подсюжет и использовать subplot_titles для достижения
fig = make_subplots(rows=2, cols=2,
start_cell="bottom-left", # 'bottom-left', 'top-left
subplot_titles=["子图1","子图2","子图3","子图4"] # 每个子图的名字
)
# 添加4个数据轨迹
fig.add_trace(
go.Bar(x=[1, 2, 3], y=[5, 10, 15]),
row=1, col=1 # 1*1
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[60, 70, 80]),
row=1, col=2 # 1*2
)
fig.add_trace(
go.Scatter(x=[50, 60, 70], y=[110, 120, 130]),
row=2, col=1 # 2*1
)
fig.add_trace(
go.Bar(x=[50, 60, 70], y=[110, 120, 130]),
row=2, col=2 # 2*2
)
fig.update_layout(height=600,
width=800,
title_text="多行多列子图制作")
fig.show()
Аннотации с несколькими подграфами
В подзаголовке мы также можем добавить метки к данным:
fig = make_subplots(rows=1, cols=2,
subplot_titles=["子图1","子图2"] # 子图名字
)
# 添加数据
fig.add_trace(
go.Bar(x=[1, 2, 3],
y=[5, 10, 15],
text=["文字1", "文字2", "文字3"], # 标注内容
textposition="inside" # 位置
),
row=1, col=1 # 1*1
)
# 添加数据
fig.add_trace(
go.Scatter(x=[1, 2, 3],
y=[5, 10, 15],
mode="markers+text", # 散点图的数据显示形式
text=["文字4", "文字5", "文字6"], # 标注内容
textposition="bottom center" # 位置
),
row=1, col=2 # 1*2
)
fig.update_layout(height=600,
width=800,
title_text="多子图添加标注")
fig.show()
Настройка ширины подкарты
Несколько подграфов, нарисованных выше, имеют одинаковый размер, и мы можем настроить их для отображения разных размеров с помощью параметров: column_widths
fig = make_subplots(rows=1,
cols=2,
column_widths=[0.35,0.65], # 重点:两个子图的宽度占比
subplot_titles=["子图1","子图2"] # 名字
)
fig.add_trace(
go.Bar(x=[1, 2, 3],
y=[5, 10, 15],
text=["文字1", "文字2", "文字3"], # 标注内容
textposition="inside" # 位置
),
row=1, col=1 # 1*1
)
# 添加数据
fig.add_trace(
go.Scatter(x=[1, 2, 3],
y=[5, 10, 15],
mode="markers+text", # 散点图的数据显示形式
text=["文字4", "文字5", "文字6"], # 标注内容
textposition="bottom center" # 位置
),
row=1, col=2 # 1*2
)
fig.update_layout(height=600,
width=800,
title_text="多子图添加标注")
fig.show()
общая ось x
Общая ось X означает совместное использование оси X для нескольких графиков в одном столбце и строке:
fig = make_subplots(rows=3,
cols=1,
# 重点参数
shared_xaxes=True, # 设置共享x轴
vertical_spacing=0.03, # 图之间的间隙大小
subplot_titles=["子图1","子图2","子图3"] # 名字
)
fig.add_trace(
go.Bar(x=[1, 2, 3],
y=[5, 10, 15],
text=["文字1", "文字2", "文字3"],
textposition="inside" # 位置
),
row=1, col=1 # 1*1
)
# 添加数据
fig.add_trace(
go.Scatter(x=[4, 5, 6],
y=[5, 10, 15],
mode="markers+text",
text=["文字4", "文字5", "文字6"],
textposition="bottom center"
),
row=2, col=1 # 2*1
)
# 添加数据
fig.add_trace(
go.Scatter(x=[10, 20, 30],
y=[25, 30, 45],
mode="markers+text", # 散点图的数据显示形式
text=["文字7", "文字8", "文字9"], # 标注内容
textposition="bottom center" # 位置
),
row=3, col=1 # 3*1
)
fig.update_layout(height=600,
width=1000,
title_text="多子图添加标注")
fig.show()
общая ось Y
Общая ось Y означает совместное использование оси Y для нескольких графиков в одной строке:
fig = make_subplots(rows=2, cols=2, # 2*2
subplot_titles=["子图1","子图2","子图3","子图4"],
shared_yaxes=True # 重点:共享y轴
)
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[2, 3, 4]), # 两个轴的数据
row=1, col=1) # 行列位置
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[5, 6, 7]),
row=1, col=2)
fig.add_trace(go.Bar(x=[20, 30, 40], y=[20, 40, 10]),
row=2, col=1)
fig.add_trace(go.Scatter(x=[40, 50, 60], y=[70, 80, 90]),
row=2, col=2)
fig.update_layout(height=600, width=600,
title_text="多子图共享y轴")
fig.show()
Настройка оси координат
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(
rows=2,
cols=2,
subplot_titles=("Plot 1", "Plot 2", "Plot 3", "Plot 4")
)
# 添加不同数据
fig.add_trace(go.Scatter(x=[1, 2, 3],
y=[4, 5, 6]),
row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40],
y=[50, 60, 70]),
row=1, col=2)
fig.add_trace(go.Scatter(x=[300, 400, 500],
y=[600, 700, 800]),
row=2, col=1)
fig.add_trace(go.Scatter(x=[4000, 5000, 6000],
y=[7000, 8000, 9000]),
row=2, col=2)
# 自定义x轴
fig.update_xaxes(title_text="xaxis—1 标题", row=1, col=1) # 正常显示
fig.update_xaxes(title_text="xaxis-2 标题", range=[10, 50], row=1, col=2) # 设置范围range
fig.update_xaxes(title_text="xaxis-3 标题", showgrid=False, row=2, col=1) # 不显示网格线
fig.update_xaxes(title_text="xaxis-4 标题", type="log", row=2, col=2) # 基于对数
# 自定义y轴
fig.update_yaxes(title_text="yaxis 1 标题", row=1, col=1)
fig.update_yaxes(title_text="yaxis 2 标题", range=[40, 80], row=1, col=2)
fig.update_yaxes(title_text="yaxis 3 标题", showgrid=False, row=2, col=1)
fig.update_yaxes(title_text="yaxis 4 标题", row=2, col=2)
# Update title and height
fig.update_layout(title_text="自定义子图轴坐标", height=700)
fig.show()
Общая цветовая ось
Используемый параметр — coloraxis
fig = make_subplots(rows=1, cols=2,
shared_yaxes=True) # 在y轴方向上共享
fig.add_trace(go.Bar(x=[1, 2, 3], y=[4, 5, 6],
marker=dict(color=[4, 5, 6],
coloraxis="coloraxis")),
1, 1) # 直接表示位置在(1,1)
fig.add_trace(go.Bar(x=[1, 2, 3], y=[2, 3, 5],
marker=dict(color=[2, 3, 5],
coloraxis="coloraxis")),
1, 2) # 位置在(1,2)
fig.update_layout(coloraxis=dict(colorscale='Bluered'), # 颜色轴
showlegend=False) # 不显示图例
fig.show()
Настройка положения подкарты
Настройка положения подграфа достигается спецификацией параметра, которая представляет собой набор двумерных списков, а список содержит два параметра: строки и столбцы.
Например, если мы хотим нарисовать график 2*2, а графиков всего 3, то должен быть график, занимающий позицию в 2 строки и 1 столбец или 1 строку и 2 столбца, что поясняется на примерах.
fig = make_subplots(
rows=2, cols=2,
specs=[[{}, {}], # 1*1,1*2
[{"colspan": 2}, None]], # 2*1的位置占据两列,2*2的位置没有图
subplot_titles=("子图1","子图2", "子图3"))
fig.add_trace(go.Scatter(x=[1, 2], y=[5, 6]),
row=1, col=1) # 1*1
fig.add_trace(go.Scatter(x=[4, 6], y=[8, 9]),
row=1, col=2) # 1*2
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[2, 5, 2]),
row=2, col=1) # 2*1占据两行
fig.update_layout(showlegend=False, # 不显示图例
title_text="子图位置自定义")
fig.show()
fig = make_subplots(
rows=2, cols=2,
specs=[[{"rowspan":2}, {}], # 1*1 占据两列,1*2
[None,{}]], # 2*1的位置没有图
subplot_titles=("子图1","子图2", "子图3"))
fig.add_trace(go.Scatter(x=[1, 2], y=[5, 6]),
row=1, col=1) # 1*1 占据两列
fig.add_trace(go.Scatter(x=[4, 6], y=[8, 9]),
row=1, col=2) # 1*2
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[2, 5, 2]),
row=2, col=2) # 2*1
fig.update_layout(showlegend=False, # 不显示图例
title_text="子图位置自定义")
fig.show()
Рассмотрим более сложный пример:
fig = make_subplots(
rows=5, cols=2, # 5*2的图形
specs=[[{}, {"rowspan": 2}], # 1*1 ; 2*1的位置占据两行rows
[{}, None], # 2*1; 2*2的位置已经被上面的2*1占据
[{"rowspan": 2, "colspan": 2}, None], # 3*1的位置占据2行2列所以,第3、4行的两列只有单个图形
[None, None],
[{}, {}]] # 5*1;5*2
)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2], name="(1,1)"), row=1, col=1)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2], name="(1,2)"), row=1, col=2)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2], name="(2,1)"), row=2, col=1)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2], name="(3,1)"), row=3, col=1)
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2], name="(5,1)"), 5,1) # row和col可以省略
fig.add_trace(go.Scatter(x=[1, 2], y=[1, 2], name="(5,2)"), 5, 2)
fig.update_layout(height=600,
width=600,
title_text="多子图位置自定义")
fig.show()
Настройка типа подграфа
Типы графиков, доступные для подграфиков:
-
«xy»: двумерный разброс, столбик гистограммы и т. д.
-
"сцена": 3D scatter3d, сферический конус
-
«полярный»: графика в полярных координатах, такая как scatterpolar, barpolar и т. д.
-
"ternary": троичный граф, такой как scatterternary
-
"mapbox": карта, такая как scattermapbox
-
"домен": .Для графики с определенным доменом, например круговая, паркорды, паркеты,
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(
rows=2, cols=2,
specs=[[{"type": "xy"}, {"type": "polar"}],
[{"type": "domain"}, {"type": "scene"}]], # 通过type来指定类型
)
fig.add_trace(go.Bar(y=[2, 3, 1]),
1, 1)
fig.add_trace(go.Barpolar(theta=[0, 45, 90], r=[2, 3, 1]),
1, 2)
fig.add_trace(go.Pie(values=[2, 3, 1]),
2, 1)
fig.add_trace(go.Scatter3d(x=[2, 3, 1], y=[0, 0, 0],
z=[0.5, 1, 2], mode="lines"),
2, 2)
fig.update_layout(height=700, showlegend=False)
fig.show()
Комбинация нескольких типов и местоположений подграфов:
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(
rows=2, cols=2,
specs=[[{"type": "xy"}, {"type": "polar"}], # 设置类型
[{"colspan":2,"type": "domain"},None]], # 设置位置:2*1的位置占据两列; 2*2没有图形
)
fig.add_trace(go.Bar(y=[2, 3, 1]),
1, 1)
fig.add_trace(go.Barpolar(theta=[0, 45, 90], r=[2, 3, 1]),
1, 2)
fig.add_trace(go.Pie(values=[2, 3, 1]),
2, 1) #
fig.update_layout(height=700, showlegend=False)
fig.show()
Описание параметра
Наконец, прикрепите официальный адрес сайта и узнайте больше:сюжет LY.com/Python/Subei дрифт…
plotly.subplots.make_subplots(rows=1, # 行列数值决定位置
cols=1,
shared_xaxes=False, # 是否共享xy轴
shared_yaxes=False,
start_cell='top-left', # 第一个图形的位置
print_grid=False, # 是否输出表格参数
horizontal_spacing=None, # 垂直和水平方向上的间隔
vertical_spacing=None,
subplot_titles=None, # 子图标题
column_widths=None, # 列宽和行高
row_heights=None,
specs=None, # 子图类型
insets=None, #
column_titles=None, # 行和列的标题
row_titles=None,
x_title=None, # xy轴axis的标题
y_title=None,
figure=None,
**kwargs)
Просмотрите справочную документацию следующими способами:
from plotly.subplots import make_subplots
help(make_subplots)