在一个普通条形图旁边创建一个堆叠条形图?

Creating ONE stacked bar beside ONE normal bar in plotly?

我有一个名为 'CountryCounts' 的系列,它是在我原始数据框的 'Country' 列 OGdf['Country'].

上调用 .value_counts() 的结果
United States           1234
United Kingdom           332
Canada                   111
France                    61
Australia                 55
                        ... 
Israel                     1
Bahamas                    1
Romania                    1
Greece                     1
United Arab Emirates       1
Name: Country, Length: 63, dtype: int64

我想要做的是创建一个 plotly 条形图,其中第一行(在本例中为美国 - 1234)被绘制为它自己的条形图。

然后,每隔一行合并后在其旁边绘制为堆叠条(总长度将是其他行的总和),但每一行都有悬停信息(这样您仍然可以看到英国是它自己的该条内的颜色、加拿大等)

我创建了一个简短的函数来分离剩余的条目,直到它们与第一个相同:

def find_next_series_equivalent(series):
  primary = series[0]
  if series[1:-1].sum() > primary:
    i = 2
    while series[1:i].sum() < primary:
      i += 1
    return series[1:i]
  else:
    return series[1:-1]

我已经通过直方图尝试过:

fig = px.histogram(OGdf, x='Country', barmode='stack')

和条形图:

first_entry = OGdf['Country'].value_counts()[0]
fig = px.bar(y = [first_entry.index], x= [first_entry.values], orientation='h')
fig.update_xaxes(title='# From Country')
fig.update_yaxes(title='Country')

othersdict = find_next_series_equivalent(OGdf['Country'].value_counts()).to_dict()
   

othersBar = go.Bar(
     y = othersdict.index,
     x = othersdict.values)

fig.add_trace(othersBar, row=1, col=1)

fig.update_layout(barmode='stack')

两者都没有实现我的目标。非常感谢您的帮助。提前致谢:)

(顺便说一句,我正在使用 plotly express,我的 pandas 绘图后端设置为 plotly)

  • 如果您按照描述的方式创建图形,那就很简单了。 xaxis 是两个值之一
  • rest 然后将参数设置为 plotly express bar
  • 有隐藏图例,您可以根据需要显示,但对于 60 多个国家/地区可能会太长
  • 使用了来自 value_counts()
  • 的样本数据
import plotly.express as px
import io
import pandas as pd
import numpy as np

df = pd.read_csv(io.StringIO("""United States           1234
United Kingdom           332
Canada                   111
France                    61
Australia                 55
Israel                     1
Bahamas                    1
Romania                    1
Greece                     1
United Arab Emirates       1"""), sep="\s\s+", engine="python", header=None).rename(columns={0:"Country",1:"Count"})

fig = px.bar(df, x=np.where(df["Country"].eq("United States"), "United States", "Other"), y="Count", 
       hover_data=["Country"], color="Country")

# if legend is not wanted...
fig = fig.update_layout(showlegend=False)
fig