Отображение имени студента при наведении на каждую точку достаточно просто. Но если вы действительно
заинтересованы в том, чтобы узнать, у какого студента есть каждый конкретный пункт для дальнейшего анализа
и хотели бы
знайте, что каждая подгруппа связана с конкретным студентом.
тогда будет очень неудобно наводить курсор на каждую точку в поисках совпадающих имен учащихся. По моему скромному мнению, оптимальный способ показать это - назначить цвет каждому ученику, чтобы любая группа была более визуально различимой. И это возможно возможно с графиком. express прямо из коробки:
Участок 1:
Код 1:
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
import numpy as np
exam_grades = [2, 3, 2, 8, 9, 7, 3, 2, 4, 7, 8, 7]
subjects = ['math', 'math', 'math', 'math', 'math', 'math', 'art', 'art', 'art', 'art', 'art', 'art']
students = ['Mike', 'Mike', 'Mike', 'Susan', 'Susan', 'Susan', 'Mike', 'Mike', 'Mike', 'Susan', 'Susan', 'Susan']
df = pd.DataFrame({'grade':exam_grades ,
'subject': subjects,
'student': students})
fig = px.box(df, x="subject", y="grade", points="all", color='student')
fig.show()
Но если вам не нравится это конкретное разделение по студентам по предмету, возможно, это вам больше нравится:
Участок 2:
Это, безусловно, не прямо из коробки. Здесь я соединил две разные px.Scatter
фигуры со студентами, идентифицированными по уникальным цветам, в одну, а затем добавил две fig.add_traces(go.Box())
, чтобы включить в них графы и убедиться, что они не разделены путем включения цветовой группировки.
Это может быть сделано более гибким в отношении количества студентов и предметов. И я был бы счастлив сделать это. Но только до тех пор, пока вы не дадите мне знать, можете ли вы использовать это.
Код 2:
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
import numpy as np
exam_grades = [2, 3, 2, 8, 9, 7, 3, 2, 4, 7, 8, 7]
subjects = ['math', 'math', 'math', 'math', 'math', 'math', 'art', 'art', 'art', 'art', 'art', 'art']
students = ['Mike', 'Mike', 'Mike', 'Susan', 'Susan', 'Susan', 'Mike', 'Mike', 'Mike', 'Susan', 'Susan', 'Susan']
df = pd.DataFrame({'grade':exam_grades ,
'subject': subjects,
'student': students})
# math
fig1 = px.scatter(df[df['subject']=='math'].reset_index(),
x=np.random.uniform(low=-0.04+0, high=0.04+0, size=len(df[df['subject']=='math'])).tolist(),
y="grade", color="student",
#size='petal_length',
hover_data=['subject']
)
# art
fig2 = px.scatter(df[df['subject']=='art'].reset_index(),
x=np.random.uniform(low=-0.04+1, high=0.04+1, size=len(df[df['subject']=='art'])).tolist(),
y="grade",
color="student",
#size='petal_length',
hover_data=['subject']
)
# Combine figures
fig = go.Figure(data=fig1._data)
fig.add_traces(data=fig2._data)
fig.add_traces(go.Box(y=df.loc[df['subject'] == 'math']['grade'], name='math'))
fig.add_traces(go.Box(y=df.loc[df['subject'] == 'art']['grade'], name='art'))
# customize legends
for i in range(0, len(fig['data'])):
if type(fig['data'][i]['customdata'])!=type(None):
fig['data'][i]['name']=fig['data'][i]['customdata'][0][0]+fig['data'][i]['name']
fig.update_layout(title = 'Subjects, students and grades',
yaxis_title="Grades",
xaxis_title="Subjects",
)
fig.update_xaxes(tickfont=dict(color='rgba(0,0,0,0)'))
fig.show()