Plotly:如何突出显示某些 xticks?

Plotly: How to highlight certain xticks?

class parser(object):
    """docstring for parser"""
    def __init__(self, path):
        self.encodeCSV = pd.read_csv(path, ',')
        self.metrics = {
                         "train_rmse" : "RMSE_Tr",
                         "validation_rmse" : "RMSE_V",
                         "train_90_quantile" : "90QT_Tr",
                         "validation_90_quantile" : "90QT_V"
                       }

    def generate_img(self):
        fig = go.Figure({
                         'layout' : {'title': {'text': 'Combination Model'},
                                     'xaxis': {'title': {'text': 'Models'}},
                                     'yaxis': {'title': {'text': 'KPI Values'}}}
                            
                        })

        for metric in self.metrics:
            fig.add_trace(go.Scatter(x=self.encodeCSV['names'],
                                     y=self.encodeCSV[metric],
                                     mode='lines+markers',
                                     name=self.metrics[metric]))
        return fig

我已经生成了一个图表来分析模型的性能。

这是一个示例

现在我必须突出一个效果最好的模型,一个简单的方法就是改变模型的 xtick 的颜色(改变圆圈 xtick 的颜色如下)

有简单的方法吗?

有比评论中建议的添加更多轴更简单的方法。 Plotly 识别 html 格式,因此您可以轻松地只格式化 go.Scatter() 中 x 参数中的一个值,例如 '<em>'+x+'</em>' 以获得此:

地块 1:

无可否认,C 并不突出 很多,所以我喜欢做的不是添加单独的轴,而是添加单独的 traces 使图中的某些点突出。在这里,我还结合了一个额外的跟踪和 som html 格式:

情节 2:

我最喜欢这种方法的一点是,当您可以通过单击图例中的名称来选择显示或隐藏突出显示的点时,它会通过增加交互性来增加一些额外的价值。我希望你会发现这很有用。如果有什么不清楚的地方,请随时告诉我。

完整代码:

import plotly.graph_objects as go
import pandas as pd
import numpy as np

# data
df = pd.DataFrame({'x': list('ABCDE'),
                   'y': [2,4,1,3,5]})

#df['y_min'] = np.where(df['y']==df['y'].min(), df['y'], np.nan)
# series with formatted x values using a list comprehension
# (further improvements are welcomed!)
#df['x_txt'] = ['<i>'+x+'</i>' if np.isnan(df['y_min'].iloc[i]) else '<b>'+x+'</b>' for i, x in enumerate(df['x'])]

# Edited -->
# Create list containing x-labels.
ymin = df['y'].argmin()
xlabels = [f"<i>{x}</i>" for x in df['x']]
xlabels[ymin] = xlabels[ymin].replace('i', 'b')

# Create array of y values.
y = np.full(df['y'].size, np.nan)
y[ymin] = df['y'].min()
# <--

# plotly
fig = go.Figure()

# add highlighted point first to appear in the back
fig.add_trace(go.Scatter(x = xlabels, y = y,        # Edited
                             mode = 'markers',
                             marker = dict(color='red', size = 12),
                             name = 'best'))

# add the main values to the figure
fig.add_trace(go.Scatter(x = xlabels, y = df['y'],   # Edited
                             mode = 'lines',
                             marker =dict(color='blue'),
                             name = 'other values'))

fig.show()