You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly三元图子图绘制及多库图表整合技术问询

Plotly三元图子图绘制及多库图表整合技术问询

我现在在Plotly Express、Plotly_figure_factory这些工具的使用上完全摸不着头脑,尤其是不知道怎么用Plotly绘制三元图的子图。

最开始我尝试用Plotly Graph Objects来实现,参考三元散点图的写法并结合子图创建方法,拼出来的代码如下:

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.graph_objects as go

rawData = [
    {'journalist':75,'developer':25,'designer':0,'label':'point 1'},
    {'journalist':70,'developer':10,'designer':20,'label':'point 2'},
    {'journalist':75,'developer':20,'designer':5,'label':'point 3'},
    {'journalist':5,'developer':60,'designer':35,'label':'point 4'},
    {'journalist':10,'developer':80,'designer':10,'label':'point 5'},
    {'journalist':10,'developer':90,'designer':0,'label':'point 6'},
    {'journalist':20,'developer':70,'designer':10,'label':'point 7'},
    {'journalist':10,'developer':20,'designer':70,'label':'point 8'},
    {'journalist':15,'developer':5,'designer':80,'label':'point 9'},
    {'journalist':10,'developer':10,'designer':80,'label':'point 10'},
    {'journalist':20,'developer':10,'designer':70,'label':'point 11'},
];

def makeAxis(title, tickangle):
    return {
      'title': {'text': title, 'font': { 'size': 20}},
      'tickangle': tickangle,
      'tickfont': { 'size': 15 },
      'tickcolor': 'rgba(0,0,0,0)',
      'ticklen': 5,
      'showline': True,
      'showgrid': True
    }

fig = go.Figure(go.Scatterternary({
    'mode': 'markers',
    'a': [i for i in map(lambda x: x['journalist'], rawData)],
    'b': [i for i in map(lambda x: x['developer'], rawData)],
    'c': [i for i in map(lambda x: x['designer'], rawData)],
    'text': [i for i in map(lambda x: x['label'], rawData)],
    'marker': {
        'symbol': 100,
        'color': '#DB7365',
        'size': 14,
        'line': { 'width': 2 }
    }
}))

fig.update_layout({
    'ternary': {
        'sum': 100,
        'aaxis': makeAxis('Journalist', 0),
        'baxis': makeAxis('<br>Developer', 45),
        'caxis': makeAxis('<br>Designer', -45)
    },
    'annotations': [{
      'showarrow': False,
      'text': 'Simple Ternary Plot with Markers',
        'x': 0.5,
        'y': 1.3,
        'font': { 'size': 15 }
    }]
})

fig.show()

my_ternary_plot = go.Scatterternary({
    'mode': 'markers',
    'a': [i for i in map(lambda x: x['journalist'], rawData)],
    'b': [i for i in map(lambda x: x['developer'], rawData)],
    'c': [i for i in map(lambda x: x['designer'], rawData)],
    'text': [i for i in map(lambda x: x['label'], rawData)],
    'marker': {
        'symbol': 100,
        'color': '#DB7365',
        'size': 14,
        'line': { 'width': 2 }
    }})

figure = make_subplots(rows=1, cols=2)

figure.add_trace(my_ternary_plot,
    row=1, col=1
)

figure.add_trace(
    my_ternary_plot,
    row=1, col=2
)

figure.update_layout(height=600, width=800, title_text="Side By Side Subplots")
figure.show()

但运行这段代码后出现了以下错误:

ValueError: Trace type 'scatterternary' is not compatible with subplot type 'xy'
at grid position (1, 1)

See the docstring for the specs argument to plotly.subplots.make_subplots for more information on subplot types

除此之外,我也找不到任何关于如何用Plotly Express绘制的三元图来创建子图的参考,比如我有这样一段Plotly Express的三元图代码:

data_rand = pd.DataFrame(data=np.random.uniform(0,1,size=((20,4))), columns = ["a","b", "c", "d"])
data_rand["size"] = 35

import plotly.graph_objects as go
import plotly.express as px

plot_ter = px.scatter_ternary(data_rand, a="a", b = "b", c="c",
    color="d", size="size")
fig.show()

我还希望最终的子图中不仅包含Plotly生成的图表,还要能整合进matplotlib的图表,但完全找不到实现方法。难道就没有类似将ax对象传入matplotlib图中那样简单的实现方式吗?


备注:内容来源于stack exchange,提问作者user37292

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:18:01