创建“的组合”;相对的;及;分组;Python中的图表

创建“的组合”;相对的;及;分组;Python中的图表,python,matplotlib,plotly,Python,Matplotlib,Plotly,我需要在plotly中创建“相对”和“分组”图表的组合 我通过使用以下代码了解了如何创建堆叠和分组: from plotly import graph_objects as go import plotly pyplt = plotly.offline.plot data = { "Sports_19": [15, 23, 32, 10, 23, 22, 32, 24], "Casual_19": [4, 12, 11, 14, 15,

我需要在plotly中创建“相对”和“分组”图表的组合

我通过使用以下代码了解了如何创建堆叠和分组:

from plotly import graph_objects as go
import plotly

pyplt = plotly.offline.plot

data = {
    "Sports_19": [15, 23, 32, 10, 23, 22, 32, 24],
    "Casual_19": [4, 12, 11, 14, 15, 12, 22, 14],
    "Yoga_19": [4, 8, 18, 6, 12, 11, 10, 4],
    "Sports_20": [11, 18, 18, 0, 20, 12, 12, 11],
    "Casual_20": [20, 10, 9, 6, 10, 11, 17, 22],
    "Yoga_20": [11, 18, 18, 0, 20, 12, 12, 11],
    "labels": ["January", "February", "March", "April", "May", 'June', 'July', "August"]
    
}

fig = go.Figure()
fig.add_trace(go.Bar(name="Sports",x=data["labels"],y=data["Sports_19"],offsetgroup=19,marker_color='lightsalmon',text=data["Sports_19"],textposition='auto'))
fig.add_trace(go.Bar(name="Casual",x=data['labels'],y=data['Casual_19'],offsetgroup=19,base=data['Sports_19'],marker_color='crimson',text=data["Casual_19"],textposition='auto'))
fig.add_trace(go.Bar(name="Yoga",x=data['labels'],y=data['Yoga_19'],marker_color='indianred',text=data["Yoga_19"],textposition='auto',offsetgroup=19,base=[val1 + val2 for val1, val2 in zip(data["Sports_19"], data["Casual_19"])]))
fig.add_trace(go.Bar(name="Sports_20",x=data["labels"],y=data["Sports_20"],offsetgroup=20,marker_color='lightsalmon',showlegend=False,text=data["Sports_20"],textposition='auto'))
fig.add_trace(go.Bar(name="Casual_20",x=data['labels'],y=data['Casual_20'],offsetgroup=20,base=data['Sports_20'],marker_color='crimson',showlegend=False,text=data["Casual_20"],textposition='auto'))
fig.add_trace(go.Bar(name="Yoga_20", x=data['labels'], y=data['Yoga_20'], marker_color='indianred', text=data["Yoga_20"], showlegend=False, textposition='auto', offsetgroup=20, base=[val1 + val2 for val1, val2 in zip(data["Sports_20"], data["Casual_20"])]))

fig.update_layout(title="2019 vs 2020 Sales by Category",yaxis_title="Sales amount in US$")

fig.show()
pyplt(fig, auto_open=True)
输出如下:

有什么方法可以将此图转换为“相对”和“分组”的组合吗?可能不使用plotly,而是使用matplotlib或其他工具

p、 以下是“相对图”(但未分组)的示例:
最简单的方法可能是创建两个新的数据框
df_perc_19
df_perc_20
来存储数据,将数据标准化为每年每个月的相对百分比,使用
四舍五入到两位数字
由于长小数将导致文本的默认方向发生变化,因此可以随意调整

然后访问这些新数据帧中用于跟踪的值,尽管它很难看,但您可以使用类似于:
text=[str(x)+“%”对于df_perc_19[“Casual_19”]]中的x,您可以获得要为
text
参数显示的百分比。


最简单的方法可能是创建两个新的数据框
df_perc_19
df_perc_20
来存储数据,将数据标准化为每年每个月的相对百分比,使用
四舍五入到两位数字
由于长小数将导致文本的默认方向发生变化,因此可以随意调整

然后访问这些新数据帧中用于跟踪的值,尽管它很难看,但您可以使用类似于:
text=[str(x)+“%”对于df_perc_19[“Casual_19”]]中的x,您可以获得要为
text
参数显示的百分比。


对不起,您需要在什么基础上合并这两个图表?我想看看过去两年中每个类别的销售份额之间的比较您的第一张图片无法解决您的目的??它比较了这两个年份,对吗?看起来你应该能够将数据从绝对值转换为百分比,然后使用基本相同的逻辑绘制?我会试着发封邮件answer@Derek是的,你做对了。我需要将日期从绝对值转换为百分比。对不起,您需要在什么基础上合并这两个图表?我想查看过去两年中每个类别的销售份额之间的比较您的第一张图片无法解决您的目的??它比较了这两个年份,对吗?看起来你应该能够将数据从绝对值转换为百分比,然后使用基本相同的逻辑绘制?我会试着发封邮件answer@Derek是的,你做对了。我需要将日期从绝对值转换为百分比。非常感谢,这个概念非常有效!非常聪明的解决方法。谢谢!很高兴听到这种方法对您很有效!非常感谢,这个概念非常好用!非常聪明的解决方法。谢谢!很高兴听到这种方法对您很有效!
import pandas as pd
import plotly
from plotly import graph_objects as go

# pyplt = plotly.offline.plot

data = {
    "Sports_19": [15, 23, 32, 10, 23, 22, 32, 24],
    "Casual_19": [4, 12, 11, 14, 15, 12, 22, 14],
    "Yoga_19": [4, 8, 18, 6, 12, 11, 10, 4],
    "Sports_20": [11, 18, 18, 0, 20, 12, 12, 11],
    "Casual_20": [20, 10, 9, 6, 10, 11, 17, 22],
    "Yoga_20": [11, 18, 18, 0, 20, 12, 12, 11],
    # "labels": ["January", "February", "March", "April", "May", 'June', 'July', "August"]
    
}

labels = ["January", "February", "March", "April", "May", 'June', 'July', "August"]
df = pd.DataFrame(data=data,index=labels)
## normalize data for the months of 2019, and the months of 2020
df_perc_19 = df.apply(lambda x: 100*x[["Sports_19","Casual_19","Yoga_19"]] / x[["Sports_19","Casual_19","Yoga_19"]].sum(),axis=1).round(2)
df_perc_20 = df.apply(lambda x: 100*x[["Sports_20","Casual_20","Yoga_20"]] / x[["Sports_20","Casual_20","Yoga_20"]].sum(),axis=1).round(2)

fig = go.Figure()
## traces for 2019
fig.add_trace(go.Bar(name="Sports",x=labels,y=df_perc_19["Sports_19"],offsetgroup=19,marker_color='lightsalmon',text=[str(x)+"%" for x in df_perc_19["Sports_19"]],textposition='auto'))
fig.add_trace(go.Bar(name="Casual",x=labels,y=df_perc_19['Casual_19'],offsetgroup=19,base=df_perc_19['Sports_19'],marker_color='crimson',text=[str(x)+"%" for x in df_perc_19["Casual_19"]],textposition='auto'))
fig.add_trace(go.Bar(name="Yoga",x=labels,y=df_perc_19['Yoga_19'],marker_color='indianred',text=[str(x)+"%" for x in df_perc_19["Yoga_19"]],textposition='auto',offsetgroup=19,base=[val1 + val2 for val1, val2 in zip(df_perc_19["Sports_19"], df_perc_19["Casual_19"])]))
## traces for 2020
fig.add_trace(go.Bar(name="Sports_20",x=labels,y=df_perc_20["Sports_20"],offsetgroup=20,marker_color='lightsalmon',showlegend=False,text=[str(x)+"%" for x in df_perc_20["Sports_20"]] ,textposition='auto'))
fig.add_trace(go.Bar(name="Casual_20",x=labels,y=df_perc_20['Casual_20'],offsetgroup=20,base=df_perc_20['Sports_20'],marker_color='crimson',showlegend=False,text=[str(x)+"%" for x in df_perc_20["Casual_20"]],textposition='auto'))
fig.add_trace(go.Bar(name="Yoga_20", x=labels, y=df_perc_20['Yoga_20'], marker_color='indianred', text=[str(x)+"%" for x in df_perc_20["Yoga_20"]], showlegend=False, textposition='auto', offsetgroup=20, base=[val1 + val2 for val1, val2 in zip(df_perc_20["Sports_20"], df_perc_20["Casual_20"])]))

fig.update_layout(title="2019 vs 2020 Sales by Category",yaxis_title="Sales amount in US$ (percentage)")

fig.show()
# pyplt(fig, auto_open=True)