注释因带有 plotly-express 的子图而变化? [英] Annotations varying by subplot with plotly-express?

查看:45
本文介绍了注释因带有 plotly-express 的子图而变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我想制作一个这样的子图,其中每个方面都有自己的 y 比例:

Suppose I want to make a subplot like this in which each facet has its own y scale:

import plotly.express as px

fig = px.scatter(px.data.iris(), x='sepal_length', y='sepal_width', facet_col='species')


def update(y):
    y.update(matches=None)
    y.showticklabels=True

fig.for_each_yaxis(update)

现在假设我想添加一些注释,位置将根据分面变量而变化,我在数据框中有这个:

Now suppose I want to add some annotations, and the position is going to vary according to the faceted variable, and I have this in a dataframe:

如果我使用 plotnine/ggplot,我可以这样做:

If I was using plotnine/ggplot I could do it like this:

ggplot(df_iris, aes(x='sepal_length', y='sepal_width')) + geom_point() + facet_wrap("~species", scales="free_y") + geom_text(aes(x='x', y='y', label='label'), data=df_text) 

是否可以在情节中做到这一点?我对子图和注释陷入了困境,我知道您可以向子图添加注释,但您必须知道行号和列号才能做到这一点,我不确定如何映射方面子区行/列索引的变量(物种).

Is it possible to do this in plotly? I got pretty bogged down mucking around with subplots and annotations, I know you can add annotations to a subplot, but you have to know the row and column number in order to do that, and I'm not sure how I can map the facet variable (species) to the subplot row/column indexes.

谢谢:)

推荐答案

我不确定这是否是最好的方法,但您可以尝试以下方法

I'm not sure if this is the best way to do it but you can try the following

import plotly.express as px
import pandas as pd

df_text = pd.DataFrame({"species":["setosa", "versicolor", "virginica"],
                        "x": [7, 7, 5],
                        "y": [3, 2, 3.5],
                        "label":["label1", "label2", "label3"]})

fig = px.scatter(px.data.iris(),
                 x='sepal_length',
                 y='sepal_width',
                 facet_col='species')

# Here are your annotations
data = px.scatter(df_text,
                  x="x",
                  y="y",
                  text="label",
                  facet_col='species')\
          .update_traces(mode="text")["data"]

def update(y):
    y.update(matches=None)
    y.showticklabels=True
    
fig.for_each_yaxis(update)

for trace in data:
    fig.add_trace(trace)

fig.show()

这篇关于注释因带有 plotly-express 的子图而变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆