params=True 的 Altair 回归变换:当有多个组时如何访问 r² 和 coeffs

2023-12-21

我在用transform_regression在图表中创建回归线和相应的方程文本。对于单个回归,这工作得很好,但是对于 setgroupby=['something']选项,文本将绘制在彼此之上。

我尝试使用构建字符串lineBreak='\n'但这没有帮助。 它还为名为的方程创建了自己的颜色组undefined,这不太实用。有什么办法可以避免这种情况吗?我知道this https://stackoverflow.com/questions/64665596/how-to-label-the-line-from-transform-regression-using-altair问题,但我不想更改名称,我宁愿根本不给它一个自己的条目。

这是一个例子:

import altair as alt
import altair_transform
import pandas as pd
import numpy as np

np.random.seed(42)
x = np.linspace(0, 10)
y = np.e ** (-0.1 *x)  + np.random.randn(len(x)) / 5
group = np.random.choice(['a','b'],len(x))

df = pd.DataFrame({'x': x, 'y': y, 'group': group})
df.loc[df.group == 'a', 'y'] *= 0.1 

chart = alt.Chart(df).mark_point().encode(
    x='x',
    y= alt.Y('y',scale = alt.Scale(type= 'log')),
    color= 'group')

Reg_Line = chart.transform_regression('x', 'y',
                                      method="exp",
                                      groupby=["group"]
).mark_line()

Reg_Params = chart.transform_regression('x', 'y',
                                     method="exp",
                                     groupby=["group"],
                                     params=True   
).mark_text(align='left', lineBreak='\n'
).encode(
    x=alt.value(150),  # pixels from left
    y=alt.value(250),  # pixels from top
    text='params:N'
).transform_calculate(
    params='"r² = " + round(datum.rSquared * 100)/100 + \
    "      y = " + round(datum.coef[0] * 10)/10 + " + e ^ (" + \
    round(datum.coef[1] * 10000)/10000 + "x" + ")" + \n + " "')

chart + Reg_Line + Reg_Params

!!这仅解决了问题的一部分!

如果我找到其余问题的解决方案,我将修改此答案。

虽然我还没有找到一种方法来解决文本相互重叠的问题,但至少有一些方法可以抑制额外的图例条目:

  • 向折线图和文本图添加颜色编码,并将其图例选项设置为None
  • 解析化合物的颜色independent

这是上面示例的修改:

import altair as alt
import altair_transform
import pandas as pd
import numpy as np

np.random.seed(42)
x = np.linspace(0, 10)
y = np.e ** (-0.1 *x)  + np.random.randn(len(x)) / 5
group = np.random.choice(['a','b'],len(x))

df = pd.DataFrame({'x': x, 'y': y, 'group': group})
df.loc[df.group == 'a', 'y'] *= 0.1 

chart = alt.Chart(df).mark_point().encode(
    x='x',
    y= alt.Y('y',scale = alt.Scale(type= 'log')),
    color= 'group')

Reg_Line = chart.transform_regression('x', 'y',
                                      method="exp",
                                      groupby=["group"]
).mark_line().encode(color=alt.Color('group', legend=None))

Reg_Params = chart.transform_regression('x', 'y',
                                     method="exp",
                                     groupby=["group"],
                                     params=True   
).mark_text(align='left', lineBreak='\n'
).encode(
    x=alt.value(150),  # pixels from left
    y=alt.value(250),  # pixels from top
    color=alt.Color('group', legend=None),
    text='params:N'
).transform_calculate(
    params='"r² = " + round(datum.rSquared * 100)/100 + \
    "      y = " + round(datum.coef[0] * 10)/10 + " + e ^ (" + \
    round(datum.coef[1] * 10000)/10000 + "x" + ")" + \n + " "')

(chart + Reg_Line + Reg_Params).resolve_scale(color='independent')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

params=True 的 Altair 回归变换:当有多个组时如何访问 r² 和 coeffs 的相关文章