Вот как вы можете сопоставить цвет текста с цветом маркера, используя for_each_trace
:
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", text='sepal_width')
fig.for_each_trace(lambda t: t.update(textfont_color=t.marker.color, textposition='top center'))
fig.show()
Относительно Легенда, это выглядит лучше IMO с моим кодом выше, но нет возможности отключить это. Вы можете попробовать подход, в котором у вас есть две трассы, одна из которых содержит только маркеры, а другая - только текст, а другая с простым текстом не отображается в легенде, например:
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", text='sepal_width')
def add_trace_copy(trace):
fig.add_traces(trace)
new_trace = fig.data[-1]
new_trace.update(textfont_color=trace.marker.color, textposition='top center',
mode="text", showlegend=False)
trace.update(mode="markers")
fig.for_each_trace(add_trace_copy)
fig.show()
Это работает, но, вероятно, только с использованием вывода функций Plotly Express, которые устанавливают legendgroup
автоматически и могут быть немного ломкими с более сложными фигурами:)