如何使用 Plotly 删除堆叠和分组条形图中的 x 轴刻度标签

Posted

技术标签:

【中文标题】如何使用 Plotly 删除堆叠和分组条形图中的 x 轴刻度标签【英文标题】:How to remove x-axis tick labels in a stacked-and-grouped bar chart using Plotly 【发布时间】:2021-10-13 21:03:46 【问题描述】:

我有一个数据集:

我想使用 Plotly 在堆叠和分组的条形图中可视化这个数据集。不幸的是,Plotly 没有这种类型的图表yet,但是我尝试过这个workaround。

我的代码:

sv_clusters = ["cluster_1", "cluster_2", "cluster_3", "cluster_4", "cluster_5", "cluster_6", "cluster_7"]
sv_data = sv_data[["Population", "Sample_name"] + sv_clusters]

for r in sv_clusters:
    fig.add_trace(
        go.Bar(
            x=[sv_data.Population, sv_data.Sample_name],
            y=sv_data[r],
            name=r,
            marker=dict(
                line_width=0)),
    )

fig.update_layout(
    template="simple_white",
    xaxis=dict(title_text=None),
    yaxis=dict(title_text="fraction"),
    width=2000,
    bargap=0,
    title='Alles',
    barmode="stack",

现在我的情节是这样的:

我想删除 x-label 刻度,因为它会使图表混乱(样本名称而不是人口名称)。所以我尝试了showticklabels=False,结果如下:

删除所有 x 轴标签。

如何去除样品名称刻度标签?

【问题讨论】:

【参考方案1】: 拥有模拟数据以使代码可重现 发现与您记录的相同问题 恢复为不使用 https://plotly.com/python/categorical-axes/#multicategorical-axes 而是编码 xaxis 然后可以更新数组以定义刻度
import requests
import pandas as pd
import numpy as np
import plotly.graph_objects as go

# generate some data... similar to what was presented
sv_data = pd.DataFrame(
    
        "Population": pd.json_normalize(
            requests.get("https://restcountries.eu/rest/v2/all").json()
        )["subregion"].unique()
    
).loc[0:6,].assign(
    Sample_name=lambda d: d["Population"]
    .str[:2]
    .str.upper()
    .apply(lambda s: [f"si" for i in range(1500, 1550)])
).explode(
    "Sample_name"
).assign(**f"cluster_i":lambda d: np.random.uniform(0,1, len(d)) for i in range(1,8))

sv_clusters = ["cluster_1", "cluster_2", "cluster_3", "cluster_4", "cluster_5", "cluster_6", "cluster_7"]
sv_data = sv_data[["Population", "Sample_name"] + sv_clusters]
fig=go.Figure()

# instead of categoricals use concatenated value for x,  define text to hover works
for r in sv_clusters:
    fig.add_trace(
        go.Bar(
            x=sv_data.loc[:,["Population","Sample_name"]].apply(lambda r: " ".join(r), axis=1),
            y=sv_data[r],
            text=sv_data.loc[:,["Population","Sample_name"]].apply(lambda r: " ".join(r), axis=1),
            name=r,
            marker=dict(
                line_width=0)),
    )

# given simple x,  set tick vals as wanted
fig.update_layout(
    template="simple_white",
    yaxis=dict(title_text="fraction"),
    width=2000,
    bargap=0,
    title='Alles',
    barmode="stack",
    xaxis="tickmode":"array", "tickvals":sv_data.loc[:,["Population","Sample_name"]].apply(lambda r: " ".join(r), axis=1),
          "ticktext":np.where(sv_data["Population"]==sv_data["Population"].shift(), "", sv_data["Population"])
)


【讨论】:

很好的解决方案!如何对每个样本的集群进行单独排序?从最高值到最低值。

以上是关于如何使用 Plotly 删除堆叠和分组条形图中的 x 轴刻度标签的主要内容,如果未能解决你的问题,请参考以下文章

plotly:分组条形图中的降序

在 100% 堆叠的条形图中更改颜色 python

Plotly Python:在具有多个 Y 轴的分组条形图中对齐 X 轴

Plotly:如何使用 go.Bar 向堆积条形图添加数据标签?

如何在 plotly express 条形图中隐藏颜色条和图例?

如何关闭 ggplot 堆叠条形图中的颜色图例?所有解决方案都失败了