Python 使用Plotly自定义标签

Python 使用Plotly自定义标签,python,pandas,cluster-analysis,plotly,k-means,Python,Pandas,Cluster Analysis,Plotly,K Means,我正在尝试自定义悬停时显示的数据标签: 下面是给出上述输出的代码: import pandas as pd import plotly.plotly as py import plotly.graph_objs as go # Create random data labels = ['A', 'B', 'C'] N = 20 df = pd.DataFrame(index = range(N)) standardized_cols = [] for col in labels: d

我正在尝试自定义悬停时显示的数据标签: 下面是给出上述输出的代码:

import pandas as pd
import plotly.plotly as py
import plotly.graph_objs as go

# Create random data
labels = ['A', 'B', 'C']
N = 20
df = pd.DataFrame(index = range(N))
standardized_cols = []

for col in labels:
    df[col] = np.random.randn(N)
    standardized_colname  =  col + "_standardized"
    standardized_cols.append(standardized_colname)
    df[standardized_colname] = (df[col]-df[col].mean())/df[col].std()

# Cluster
c = KMeans(n_clusters=3, random_state=1).fit(df[standardized_cols]).labels_

# Plot
trace = go.Scatter3d(
    x=df.A_standardized,
    y=df.B_standardized,
    z=df.C_standardized,

    mode='markers',
    marker=dict(
        size=5,
        color=c,              
        colorscale='Viridis',   
    ),
    name= 'test',
    text= c
)

data = [trace]

fig = go.Figure(data=data, layout=layout)
iplot(fig)
我的数据: ]

图表显示了标准化列的集群。 但是当在数据上悬停时,我希望看到标签中的非标准化数据,例如

A: 0,999
B: 0,565
C: 0,765
Cluster: 2

我尝试过,但不知道如何做到这一点。这可能吗?

您可以进行一些列表理解,并添加您想要的任何列
文本
参见下面的示例(注意,我正在脱机绘图):

绘图:

以绘图方式导入为py
导入plotly.graph_objs作为go
trace=go.Scatter3d(
x=df.A_标准化,
y=df.B_标准化,
z=df.C_标准化,
mode='markers',
记号笔(
尺寸=5,
颜色=c,
色阶='Viridis',
),
名称='测试',
#列出要在悬停时添加文本的理解
text=[f“A:{A}
B:{B}
C:{C}”表示列表中的A、B、C(zip(df['A'],df['B'],df['C']), #如果不想显示x、y、z #hoverinfo='text' ) 布局=目录(标题=‘测试’,) 数据=[跟踪] 图=dict(数据=数据,布局=布局) py.offline.plot(图,文件名='stackTest.html')

您可以修改列表以显示所需内容


如果您不想显示
x,y,z
,则添加
hoverinfo='text'

np.random.seed(1)
时,悬停上的数据是索引3。我认为
以绘图方式导入。图\u工厂为ff
已过时here@zinyosrim它是,很抱歉…我从本周早些时候正在处理的另一个
图形中获取了导入内容。
# data
np.random.seed(1)
labels = ['A', 'B', 'C']
N = 20
df = pd.DataFrame(index = range(N))
standardized_cols = []

for col in labels:
    df[col] = np.random.randn(N)
    standardized_colname  =  col + "_standardized"
    standardized_cols.append(standardized_colname)
    df[standardized_colname] = (df[col]-df[col].mean())/df[col].std()

c = KMeans(n_clusters=3, random_state=1).fit(df[standardized_cols]).labels_
import plotly as py
import plotly.graph_objs as go


trace = go.Scatter3d(
    x=df.A_standardized,
    y=df.B_standardized,
    z=df.C_standardized,

    mode='markers',
    marker=dict(
        size=5,
        color=c,              
        colorscale='Viridis',   
    ),
    name= 'test',

    # list comprehension to add text on hover
    text= [f"A: {a}<br>B: {b}<br>C: {c}" for a,b,c in list(zip(df['A'], df['B'], df['C']))],
    # if you do not want to display x,y,z
    # hoverinfo='text'


)


layout = dict(title = 'TEST',)

data = [trace]
fig = dict(data=data, layout=layout)

py.offline.plot(fig, filename = 'stackTest.html')