Plotly: Как назначить уникальное имя для каждой точки на диаграмме? - PullRequest
1 голос
/ 13 февраля 2020

Допустим, я хочу проанализировать экзаменационные оценки некоторых студентов во время курса. У меня есть следующие данные:

    grade subject student
0       2    math    Mike
1       3    math    Mike
2       2    math    Mike
3       8    math   Susan
4       9    math   Susan
5       7    math   Susan
6       3     art    Mike
7       2     art    Mike
8       4     art    Mike
9       7     art   Susan
10      8     art   Susan
11      7     art   Susan

На первый взгляд, я заинтересован в глобальном изучении моего набора данных. Например, используя Plotly's Box Plot:

import pandas as pd
import plotly.graph_objects as go

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,
                   'students': students})

fig = go.Figure()
fig.add_trace(go.Box(y=df.loc[df['subject'] == 'math']['grade'], name='math'))
fig.add_trace(go.Box(y=df.loc[df['subject'] == 'art']['grade'], name='art'))

fig.update_traces(boxpoints='all', boxmean=True)
fig.show()

Выход:

enter image description here

Хорошо, теперь моя проблема. Я ясно вижу, что в каждой теме есть две разные подгруппы. Мне интересно знать, у какого студента есть каждый конкретный пункт для дальнейшего анализа. Это дало бы мне представление о том, что происходит, чтобы выбрать более правильный способ разделения и отображения данных. В моем примере я мог знать, что каждая подгруппа связана с конкретным учеником.

До сих пор я нашел только опцию Plotly «текст», поэтому на ярлыке при наведении курсора будет показана строка. Но эта строка будет одинаковой для всех точек каждого участка графика.

Что вы предлагаете?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Отображение имени студента при наведении на каждую точку достаточно просто. Но если вы действительно

заинтересованы в том, чтобы узнать, у какого студента есть каждый конкретный пункт для дальнейшего анализа

и хотели бы

знайте, что каждая подгруппа связана с конкретным студентом.

тогда будет очень неудобно наводить курсор на каждую точку в поисках совпадающих имен учащихся. По моему скромному мнению, оптимальный способ показать это - назначить цвет каждому ученику, чтобы любая группа была более визуально различимой. И это возможно возможно с графиком. express прямо из коробки:

Участок 1:

enter image description here

Код 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:

enter image description here

Это, безусловно, не прямо из коробки. Здесь я соединил две разные 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()
1 голос
/ 13 февраля 2020

Вы можете установить текст патаметера со списком имен учеников, вот пример:

fig.add_trace(go.Box(y=df.loc[df['subject'] == 'math']['grade'], name='math', text=students))
fig.add_trace(go.Box(y=df.loc[df['subject'] == 'art']['grade'], name='art', text=students))

при наведении мыши:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...