Не уверен насчет того, чего вы хотите достичь, но иметь Позицию и Счет на одной оси, это не очень хорошая идея, если учесть, что позиция может быть более чем в 200.000 раз больше, чем оценка.
Сгруппированы бары
Здесь я беру только одно значение для каждого параметра класса df=df.groupby("CLASS").first().reset_index()
. Чтобы показать все классы, нужно использовать df.index
в качестве x, а затем изменить ticktext
в макете.
import pandas as pd
import plotly.graph_objs as go
fig = go.Figure()
fig.add_trace(go.Bar(x=df.index,
y=df["POSITION"],
name="Position"))
fig.add_trace(go.Bar(x=df.index,
y=df["SCORE"],
name="Score"))
fig.update_layout(
xaxis = dict(
tickmode = 'array',
tickvals = df.index,
ticktext = df["CLASS"])
)
Подплот
Здесь более или менее то же самое, но с использованием двух вспомогательных участков.
import pandas as pd
from plotly.subplots import make_subplots
import plotly.graph_objs as go
fig = make_subplots(rows=1, cols=2,
subplot_titles=["Position",
"Score"]
)
fig.add_trace(go.Bar(x=df.index,
y=df["POSITION"],
name="Position"),
row=1, col=1)
fig.add_trace(go.Bar(x=df.index,
y=df["SCORE"],
name="Score"),
row=1, col=2)
fig['layout']['xaxis1'].update(dict(
tickmode = 'array',
tickvals = df.index,
ticktext = df["CLASS"]))
fig['layout']['xaxis2'].update(dict(
tickmode = 'array',
tickvals = df.index,
ticktext = df["CLASS"]))
fig.show()
Обновление
Учитывая Данные, которые вы добавили недавно, вы можете попробовать использовать заполнитель для сортировки df
перед построением.
df = df.groupby("CLASS")["SCORE"].first().reset_index()
def fun(x):
try:
return str(int(x)).zfill(2)
except:
return x
df["ph"] = df["CLASS"].apply(fun)
df = df.sort_values("ph").reset_index(drop=True)
fig = go.Figure()
fig.add_trace(go.Bar(x=df.index,
y=df["SCORE"],
name="Score"))
fig.update_layout(
xaxis = dict(
tickmode = 'array',
tickvals = df.index,
ticktext = df["CLASS"])
)