如何避免散点图中的文本重叠?
How to avoid overlapping text in a plotly scatter plot?
我正在寻找避免文本标签中文本重叠的解决方案。我用 plotly scatter 创建图像。也许这里有一个自动化。
from pandas import util
import plotly.express as px
import plotly.graph_objects as go
df= util.testing.makeDataFrame()
df_keyfigures_all = df[['A','B']]
fig = px.scatter(df_keyfigures_all, x="A", y="B",size_max=60,
text=df_keyfigures_all.index)
fig.update_traces(textposition='top center')
fig.layout = go.Layout(yaxis=dict(tickformat=".0%"), xaxis=dict(tickformat=".0%"),
yaxis_title="A", xaxis_title="B")
fig.update_layout(showlegend=False)
plotly.io.write_image(fig, file='keyfigures.png', format='png')
感谢帮助!
不幸的是,似乎没有直接的方法可以做到这一点。在 plotly 社区论坛上稍微挖掘一下就会发现它有 already been requested and that the developers are aware 个问题。
这不是完美的解决方案,但一种方法是隐藏悬停文本中的文本。
fig = px.scatter(df_keyfigures_all, x="A", y="B",size_max=60,
hover_name = df_keyfigures_all.index)
一种解决方案是交替文本位置 like in this live demo:
import pandas as pd
from plotly import express as px, graph_objects as go
df = pd.DataFrame()
df['x'] = [0, 1, 1, 2, 3, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12]
df['y'] = [57, 55, 75, 23, 80, 66, 66, 23, 79, 79, 20, 71, 59, 74, 82, 77]
df['explainer_name'] = ['tree_shap_approximation', 'saabas', 'tree_shap', 'baseline_random', 'archipelago',
'shapley_taylor_interaction', 'partition', 'anova', 'permutation_partition', 'permutation',
'shap_interaction', 'sage', 'maple', 'lime', 'kernel_shap', 'exact_shapley_values']
fig = px.scatter(df,
x='x',
y='y',
# size='dot_size',
text='explainer_name',
# log_x=True,
labels={
"x": "Time",
"y": "Score",
# 'dot_size': 'Portability',
'explainer_name': 'Explainer '
},
title='No overlapping annotations', # take some vertical space
)
def improve_text_position(x):
""" it is more efficient if the x values are sorted """
positions = ['top center', 'bottom center'] # you can add more: left center ...
return [positions[i % len(positions)] for i in range(len(x))]
fig.update_traces(textposition=improve_text_position(df['x']))
fig.show()
之前:
之后:
我正在寻找避免文本标签中文本重叠的解决方案。我用 plotly scatter 创建图像。也许这里有一个自动化。
from pandas import util
import plotly.express as px
import plotly.graph_objects as go
df= util.testing.makeDataFrame()
df_keyfigures_all = df[['A','B']]
fig = px.scatter(df_keyfigures_all, x="A", y="B",size_max=60,
text=df_keyfigures_all.index)
fig.update_traces(textposition='top center')
fig.layout = go.Layout(yaxis=dict(tickformat=".0%"), xaxis=dict(tickformat=".0%"),
yaxis_title="A", xaxis_title="B")
fig.update_layout(showlegend=False)
plotly.io.write_image(fig, file='keyfigures.png', format='png')
感谢帮助!
不幸的是,似乎没有直接的方法可以做到这一点。在 plotly 社区论坛上稍微挖掘一下就会发现它有 already been requested and that the developers are aware 个问题。
这不是完美的解决方案,但一种方法是隐藏悬停文本中的文本。
fig = px.scatter(df_keyfigures_all, x="A", y="B",size_max=60,
hover_name = df_keyfigures_all.index)
一种解决方案是交替文本位置 like in this live demo:
import pandas as pd
from plotly import express as px, graph_objects as go
df = pd.DataFrame()
df['x'] = [0, 1, 1, 2, 3, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12]
df['y'] = [57, 55, 75, 23, 80, 66, 66, 23, 79, 79, 20, 71, 59, 74, 82, 77]
df['explainer_name'] = ['tree_shap_approximation', 'saabas', 'tree_shap', 'baseline_random', 'archipelago',
'shapley_taylor_interaction', 'partition', 'anova', 'permutation_partition', 'permutation',
'shap_interaction', 'sage', 'maple', 'lime', 'kernel_shap', 'exact_shapley_values']
fig = px.scatter(df,
x='x',
y='y',
# size='dot_size',
text='explainer_name',
# log_x=True,
labels={
"x": "Time",
"y": "Score",
# 'dot_size': 'Portability',
'explainer_name': 'Explainer '
},
title='No overlapping annotations', # take some vertical space
)
def improve_text_position(x):
""" it is more efficient if the x values are sorted """
positions = ['top center', 'bottom center'] # you can add more: left center ...
return [positions[i % len(positions)] for i in range(len(x))]
fig.update_traces(textposition=improve_text_position(df['x']))
fig.show()
之前:
之后: