График в автономном режиме: создание гистограммы из 2 столбцов (ось Y) и 1 столбца (ось X) - PullRequest
1 голос
/ 07 января 2020

Мне нравится создавать автономную гистограмму из 3 столбцов (CLASS, POSITION, SCORE) из файла big.tsv, для которого я использую Plotly.

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

Например: класс 1 имеет оценку 385,45 и 424,66 в позициях 5935161 и 5935162 соответственно.

Вот пример данных:

    CLASS   POSITION    SCORE
1   5935162 385.45
1   5937168 424.66
2   5939544 1302.35
2   5948677 1501.93
3   153278829   1466.27
3   153284192   988.13
3   153284483   1432.21
4   153278829   1466.27
4   153284192   988.13
4   153284483   1432.21
5   153278829   1466.27
5   153284192   988.13
6   153284483   1432.21
6   153278829   1466.27
7   153284192   988.13
8   153284483   1432.21
8   153278829   1466.27
8   153284192   988.13
9   153284483   1432.21
10  153278829   1466.27
11  153284192   988.13
11  153284483   1432.21
12  153278829   1466.27
12  153284192   988.13
13  153284483   1432.21
A   153633359   617.39
A   153689893   1808.94
B   153880830   2507.65
B   153881525   2354.97

Я хочу построить столбец 1 на оси X и столбцы 2 и 3 на оси Y, но не могу написать для него код. Но я успешно пишу код с помощью учебных пособий, которые рисуют столбцы 1 и 3, но не печатают все строки (G & F):

import pandas as pd
import plotly.express as px
df = pd.read_csv('DATA.txt',"\t")
fig = px.bar(df, x = 'CLASS', y = 'SCORE')
fig.show()

Код сгенерировал следующий сюжет: [Barchart не делает ' t представляют значения G & F] [enter image description here] 1

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

Предлагаемый код генерирует следующий график с неправильным порядком оси X The order of bars is incorrect

1 Ответ

1 голос
/ 07 января 2020

Не уверен насчет того, чего вы хотите достичь, но иметь Позицию и Счет на одной оси, это не очень хорошая идея, если учесть, что позиция может быть более чем в 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"])
)

enter image description here

Подплот

Здесь более или менее то же самое, но с использованием двух вспомогательных участков.

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()

enter image description here

Обновление

Учитывая Данные, которые вы добавили недавно, вы можете попробовать использовать заполнитель для сортировки 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"])
)

enter image description here

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