如何将Plotly Box图的统计标签翻译为俄语?
解决Plotly Box图统计标签俄语本地化问题
问题描述
我以Flask为服务器搭建Dash数据可视化网站,使用Plotly的go模块创建Pie、Scatter、Box三类图表。Pie与Scatter的文本可正常自定义,但Box图自带的min、q1、中位数、lower fence、q3、upper fence、max等统计标签,尝试通过设置layout的locale参数为俄语('ru_EU')后仍未生效,需要修改这些标签语言、自定义替换或删除它们的方法。
解决方案
方法1:自定义Box图悬停文本(最灵活可控)
直接在go.Box中手动计算统计值并生成俄语悬停文本,完全绕过Plotly默认的标签系统。修改你的salbox函数如下:
def salbox(df):#salary for different levels, graph which I want to translate df1 = df[df['level'] != missing] fig = [] # 俄语统计标签映射 ru_stats = { 'min': 'Минимум', 'q1': 'Q1', 'median': 'Медиана', 'q3': 'Q3', 'max': 'Максимум', 'lower_fence': 'Нижняя граница', 'upper_fence': 'Верхняя граница' } for level in df1['level'].unique(): df_level = df1.loc[df1['level'] == level] df_level['salary'] = (df_level['min_salary'] + df_level['max_salary']) / 2 salary_data = df_level['salary'].dropna() # 计算箱线图所需统计值 min_val = salary_data.min() q1_val = salary_data.quantile(0.25) median_val = salary_data.median() q3_val = salary_data.quantile(0.75) max_val = salary_data.max() iqr = q3_val - q1_val lower_fence = q1_val - 1.5 * iqr upper_fence = q3_val + 1.5 * iqr # 构建自定义俄语悬停文本 hover_content = f""" {ru_stats['min']}: {min_val:.2f} {ru_stats['q1']}: {q1_val:.2f} {ru_stats['median']}: {median_val:.2f} {ru_stats['q3']}: {q3_val:.2f} {ru_stats['max']}: {max_val:.2f} {ru_stats['lower_fence']}: {lower_fence:.2f} {ru_stats['upper_fence']}: {upper_fence:.2f} """ fig.append(go.Box( y=df_level['level'], x=df_level['salary'], orientation='h', name=level, hovertext=hover_content, hoverinfo='text' # 指定仅显示自定义文本 )) return fig
方法2:正确配置Plotly全局Locale
仅设置layout的locale可能无效,需要确保Plotly加载了俄语语言包并全局配置:
- 在代码开头添加Locale初始化:
import plotly.io as pio # 可先打印支持的Locale列表确认俄语是否存在:print(pio.locales) # 设置默认Locale为俄语 pio.locale.default = 'ru'
- 然后在Box图的layout中指定locale:
# 在dcc.Graph的figure配置里修改 figure={'data' : salbox(df), 'layout' : { 'width' : 500, 'height' : 300, 'locale': 'ru' # 使用Plotly支持的俄语Locale代码 }}
方法3:隐藏统计标签(无需显示时)
如果不需要这些统计标签,可以直接关闭相关显示:
def salbox(df):#salary for different levels, graph which I want to translate df1 = df[df['level'] != missing] fig = [] for i in df1['level'].unique(): df2 = df1.loc[df1['level'] == i] df2['salary'] = (df2['min_salary'] + df2['max_salary']) / 2 fig += [go.Box( y = df2['level'], x = df2['salary'], orientation='h', name=i, hoverinfo='x+y' # 仅显示x/y值,不展示统计标签 # 可选:隐藏箱线图的外部点 # boxpoints=False )] return fig
内容的提问来源于stack exchange,提问作者Арсен Нуриманов
相关产品推荐
相关产品推荐

