离线绘图:生成(y 轴)2 列和(x 轴)1 列的条形图

Offline Plotly: Generate bar chart of 2 columns on (y axis) & 1 column on ( x axis)

我喜欢从我使用 Plotly 的 big.tsv 文件生成 3 列(CLASS、POSITION、SCORE)的离线条形图。

我正在寻找可以绘制所有 类 及其各自值的代码。

For Example: Class 1 have score 385.45 and 424.66 at position 5935161 and 5935162 respectively.

示例数据如下:

    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

我想在 X 轴上绘制第 1 列,在 Y 轴上绘制第 2 列和第 3 列,但无法为其编写代码。但是我在教程的帮助下成功地编写了一个代码,该代码正在绘制第 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()

生成的代码如下图: [条形图不代表 G & F 的值][]1

如果有人能帮我解决上面的问题就好了。

建议的代码生成以下 x 轴顺序不正确的图表

不确定您想要实现什么,但是将位置和分数放在同一个轴上,这听起来不是个好主意,因为位置可能比分数大 200.000 倍以上。

分组条形图

这里我只为每个 class 设置取一个值 df=df.groupby("CLASS").first().reset_index()。显示所有 classes 的技巧是使用 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"])
)