<p>您可以使用<code>Plotly Express</code>然后直接访问所描述的@vesland的figure对象,但我个人更喜欢使用<code>graph_objects</code>在一个地方进行所有更改</p>
<p>我还将指出,由于您正在一个图表中堆叠条形图,因此不需要子图。您可以使用<code>fig = go.Figure()</code>创建一个<code>graph_object</code>并添加跟踪以获得堆叠的条带,类似于您已经做的</p>
<p>对于问题1,如果您使用<code>go.Bar()</code>,则可以传递一个宽度参数。但是,这是以位置轴为单位的,因为y轴是分类的,所以宽度=1将填充整个类别,所以我选择了红色条的宽度=0.25,蓝色条的宽度=0.3(稍大),因为这似乎是您的意图</p>
<p>对于问题2,我唯一想到的是一个黑客。将条拆分为两个部分(一个部分的高度=原始高度-1),并将其不透明度设置为0,使其透明。然后将高度为1的下杆放在透明杆的顶部</p>
<p>如果不希望记录道显示在图例中,可以通过将<code>showlegend=False</code>传递到<code>fig.add_trace</code>来为每个条单独设置,或者通过将<code>showlegend=False</code>传递到<code>fig.update_layout</code>方法来完全隐藏图例</p>
<pre><code>import plotly.express as px
import plotly.graph_objects as go
# from plotly.subplots import make_subplots
import plotly as py
import pandas as pd
from plotly import tools
d = {'Mkt_cd': ['Mkt1','Mkt2','Mkt3','Mkt4','Mkt5','Mkt1','Mkt2','Mkt3','Mkt4','Mkt5'],
'Category': ['Apple','Orange','Grape','Mango','Orange','Mango','Apple','Grape','Apple','Orange'],
'CategoryKey': ['Mkt1Apple','Mkt2Orange','Mkt3Grape','Mkt4Mango','Mkt5Orange','Mkt1Mango','Mkt2Apple','Mkt3Grape','Mkt4Apple','Mkt5Orange'],
'Current': [15,9,20,10,20,8,10,21,18,14],
'Goal': [50,35,21,44,20,24,14,29,28,19]
}
dataset = pd.DataFrame(d)
grouped = dataset.groupby('Category', as_index=False).sum()
data = grouped.to_dict(orient='list')
v_cat = grouped['Category'].tolist()
v_current = grouped['Current']
v_goal = grouped['Goal']
fig = go.Figure()
## you have a categorical plot and the units for width are in position axis units
## therefore width = 1 will take up the entire allotted space
## a width value of less than 1 will be the fraction of the allotted space
fig.add_trace(go.Bar(
x=v_current,
y=v_cat,
marker_color="#ff0000",
orientation='h',
width=0.25
))
## you can show the right edge of the bar by splitting it into two bars
## with the majority of the bar being transparent (opacity set to 0)
fig.add_trace(go.Bar(
x=v_goal-1,
y=v_cat,
marker_color="#ffffff",
opacity=0,
orientation='h',
width=0.30,
))
fig.add_trace(go.Bar(
x=[1]*len(v_cat),
y=v_cat,
marker_color="#1f77b4",
orientation='h',
width=0.30,
))
fig.update_layout(barmode='relative')
fig.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/3XQ8U.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/3XQ8U.png" alt="enter image description here"/></a></p>