<p>这里有两个解决方案(堆叠和未堆叠)。根据您的问题,我们将:</p>
<ul>
<li>在左y轴绘制<code>Head_Count</code>,在右y轴绘制<code>UTL_R</code>。在</li>
<li><code>report_date</code>将是我们的x轴</li>
<li><code>shift</code>将代表图形的色调。在</li>
</ul>
<p>堆叠版本使用<code>pandas</code>默认打印功能,未堆叠版本使用<code>seaborn</code>。在</p>
<p><br/>
根据你的要求,我添加了一个100%堆积图。虽然它不完全是您在注释中要求的,但是您所要求的图形类型在读取时可能会造成一些混乱(这些值是基于堆栈的上行或堆栈的宽度)。另一种解决方案是使用100%堆积图。在</p>
<p><strong>堆叠</strong></p>
<pre><code>import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
dfg = df.set_index(['report_date', 'shift']).sort_index(level=[0,1])
fig, ax = plt.subplots(figsize=(12,6))
ax2 = ax.twinx()
dfg['Head_Count'].unstack().plot.bar(stacked=True, ax=ax, alpha=0.6)
dfg['UTL_R'].unstack().plot(kind='line', ax=ax2, marker='o', legend=None)
ax.set_title('My Graph')
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/VRKHK.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/VRKHK.png" alt="enter image description here"/></a></p>
<p><strong>100%堆积</p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/8vPUm.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/8vPUm.png" alt="enter image description here"/></a></p>
<p><strong>未堆叠</strong></p>
<pre><code>import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
dfg = df.set_index(['report_date', 'shift']).sort_index(level=[0,1])
fig, ax = plt.subplots(figsize=(15,6))
ax2 = ax.twinx()
sns.barplot(x=dfg.index.get_level_values('report_date'),
y=dfg.Head_Count,
hue=dfg.index.get_level_values('shift'), ax=ax, alpha=0.7)
sns.lineplot(x=dfg.index.get_level_values('report_date'),
y=dfg.UTL_R,
hue=dfg.index.get_level_values('shift'), ax=ax2, marker='o', legend=None)
ax.set_title('My Graph')
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/OQ2VU.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/OQ2VU.png" alt="enter image description here"/></a></p>
<hr/>
<p><strong>编辑2</strong></p>
<p>这是您第二次请求的图形(堆栈,但堆栈n+1不是从堆栈n结束的位置开始的)。在</p>
<p>因为我们要做很多事情,所以它的参与程度要稍微高一些:
-我们需要手动为df中的<code>shift</code>指定颜色
-一旦我们分配了颜色,我们将迭代每个日期范围和1)排序或<code>Head_Count</code>值降序(以便我们在绘制图形时最大的sack在后面),2)绘制数据并将颜色分配给每个stacj
-然后我们可以创建第二个y轴并绘制<code>UTL_R</code>值
-然后我们需要为图例标签指定正确的颜色</p>
<pre><code>import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
def assignColor(shift):
if shift == 'A':
return 'R'
if shift == '1':
return 'B'
if shift == '2':
return 'G'
if shift == '3':
return 'Y'
# map a color to a shift
df['color'] = df['shift'].apply(assignColor)
fig, ax = plt.subplots(figsize=(15,6))
# plot our Head_Count values
for date in df.report_date.unique():
d = df[df.report_date == date].sort_values(by='Head_Count', ascending=False)
y = d.Head_Count.values
x = date
color = d.color
b = plt.bar(x,y, color=color)
# Plot our UTL_R values
ax2 = ax.twinx()
sns.lineplot(x=df.report_date, y=df.UTL_R, hue=df['shift'], marker='o', legend=None)
# Assign the color label color to our legend
leg = ax.legend(labels=df['shift'].unique(), loc=1)
legend_maping = dict()
for shift in df['shift'].unique():
legend_maping[shift] = df[df['shift'] == shift].color.unique()[0]
i = 0
for leg_lab in leg.texts:
leg.legendHandles[i].set_color(legend_maping[leg_lab.get_text()])
i += 1
</code></pre>
<p><a href="https://i.stack.imgur.com/CRVyt.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/CRVyt.png" alt="enter image description here"/></a></p>