为什么我的 Plotly 条形图将条形堆叠在同一类别中?

问题描述 投票:0回答:1

我有一个条形图,显示了建筑物在不同时间段内使用的会议室数量。最初,该图表按预期工作,但后来我添加了更多楼层的数据,即使数据应属于同一类别,条形图也已堆积起来:

例如,第 1 周星期一上午 10 点的栏显示 4、6 和 1 个正在使用的会议室,全部堆叠在一起,而不是 1 个栏显示 11。“正在使用的会议室 x 楼层”只是包含通过计算列中的 0 计算得出的整数值,表示房间是空的。

这是我的代码:

NUMBER OF MEETING ROOMS IN USE

import plotly.graph_objects as go

# Create a new column with zeros
dframe_meeting['Meeting Rooms in Use x Floor'] = 0

# Update the column with the calculated sum
dframe_meeting.loc[dframe_meeting['Type'] == 'Meeting Room', 'Meeting Rooms in Use x Floor'] = dframe_meeting[
    (dframe_meeting['Type'] == 'Meeting Room')].groupby(['Building','Week', 'Day', 'Time','Floor'])['Hours in Use'].transform('sum')

# Create a new data frame and import relevant columns
df_meeting_all_floors = dframe_meeting[['Week', 'Day', 'Time', 'Floor', 'Meeting Rooms in Use x Floor', 'Number of Meeting Rooms x Floor']].dropna()
df_meeting_all_floors = df_meeting_all_floors.drop_duplicates()


# Create a column for time slot

df_meeting_all_floors['Week'] = df_meeting_all_floors['Week'].astype(str)
df_meeting_all_floors['Time Slot'] = df_meeting_all_floors['Time'] + ', ' + df_meeting_all_floors['Day'] + ', Week ' + df_meeting_all_floors['Week']

df_meeting_all_floors = df_meeting_all_floors.sort_values(by=['Time Slot'])

# Sorting based on 'Time Slot' while keeping other columns in the same order
sort_order = df_meeting_all_floors['Time Slot'].argsort()
df_meeting_all_floors = df_meeting_all_floors.iloc[sort_order]

# Using Plotly Graph Objects to create a bar chart including customized labels, colors, and widths
fig_meeting_rooms_all_floors = go.Figure(data=[go.Bar(x=df_meeting_all_floors["Time Slot"],
                                                      y=df_meeting_all_floors["Meeting Rooms in Use x Floor"],
                                                      marker_color='#26A2ED')],)

fig_meeting_rooms_all_floors.update_layout(title_text="Number of Meeting Rooms in Use for All Floors",
                                            template="simple_white",
                                            bargap=0.03,
                                            showlegend=False,
                                            height=700,
                                            width=1000,
                                            yaxis_range=[0, df_meeting_all_floors['Number of Meeting Rooms x Floor'].max()])

fig_meeting_rooms_all_floors.update_yaxes(title_text="Number of Meeting Rooms in Use")
fig_meeting_rooms_all_floors.update_xaxes(title_text="Time")
fig_meeting_rooms_all_floors.update_xaxes(categoryorder='array', categoryarray=[
    "8am, Monday, Week 1", "9am, Monday, Week 1", "10am, Monday, Week 1", "11am, Monday, Week 1",
    "12pm, Monday, Week 1", "1pm, Monday, Week 1", "2pm, Monday, Week 1", "3pm, Monday, Week 1",
    "4pm, Monday, Week 1", "5pm, Monday, Week 1", "6pm, Monday, Week 1", "7pm, Monday, Week 1",
    "8pm, Monday, Week 1", "8am, Tuesday, Week 1", "9am, Tuesday, Week 1", "10am, Tuesday, Week 1",
    "11am, Tuesday, Week 1", "12pm, Tuesday, Week 1", "1pm, Tuesday, Week 1", "2pm, Tuesday, Week 1",
    "3pm, Tuesday, Week 1", "4pm, Tuesday, Week 1", "5pm, Tuesday, Week 1", "6pm, Tuesday, Week 1",
    "7pm, Tuesday, Week 1", "8pm, Tuesday, Week 1", "8am, Wednesday, Week 1", "9am, Wednesday, Week 1",
    "10am, Wednesday, Week 1", "11am, Wednesday, Week 1", "12pm, Wednesday, Week 1", "1pm, Wednesday, Week 1",
    "2pm, Wednesday, Week 1", "3pm, Wednesday, Week 1", "4pm, Wednesday, Week 1", "5pm, Wednesday, Week 1",
    "6pm, Wednesday, Week 1", "7pm, Wednesday, Week 1", "8pm, Wednesday, Week 1", "8am, Thursday, Week 1",
    "9am, Thursday, Week 1", "10am, Thursday, Week 1", "11am, Thursday, Week 1", "12pm, Thursday, Week 1",
    "1pm, Thursday, Week 1", "2pm, Thursday, Week 1", "3pm, Thursday, Week 1", "4pm, Thursday, Week 1",
    "5pm, Thursday, Week 1", "6pm, Thursday, Week 1", "7pm, Thursday, Week 1", "8pm, Thursday, Week 1"])


fig_meeting_rooms_all_floors.add_hline(y=df_meeting_all_floors["Meeting Rooms in Use x Floor"].median())

# Adding the line for average population
med_meeting_rooms_all_floors = df_meeting_all_floors["Meeting Rooms in Use x Floor"].median()
fig_meeting_rooms_all_floors.layout.xaxis2 = go.layout.XAxis(overlaying='x', range=[0, 2], showticklabels=False)
fig_meeting_rooms_all_floors.add_scatter(x=[0, 2], y=[med_meeting_rooms_all_floors, med_meeting_rooms_all_floors], mode='lines+text', xaxis='x2', marker_color='Black',
                                          text='Median: ' + str(med_meeting_rooms_all_floors),
                                          textposition='top left',
                                          textfont=dict(color='Black'),
                                          name='citations',
                                          showlegend=False)

fig_meeting_rooms_all_floors.show()

我已阅读 Plotly 文档:https://plotly.com/python/bar-charts/。它解决了这个问题并建议使用直方图。当我尝试时,我得到了一个显示错误值的不同图表:

python plotly
1个回答
0
投票

假设我正确地重新创建了您的数据,则条形图中的堆叠是由于同一时间段内存在不同的楼层和建筑物。对代码进行一些小的重组后,它会创建一个如下所示的条形图:

第一步是对

Meeting Rooms in Use x Floor
列中的值求和,使其成为一列。我认为这就是您正在寻找的。 下一步是将列
Week
Day
Time
设为所有有序分类值。对这些列进行排序后,条形图会以正确的顺序显示。

#NUMBER OF MEETING ROOMS IN USE

from pandas.api.types import CategoricalDtype
import plotly.graph_objects as go

# Create a new column with zeros
dframe_meeting["Meeting Rooms in Use x Floor"] = 0

# Update the column with the calculated sum
dframe_meeting.loc[dframe_meeting["Type"] == "Meeting Room", "Meeting Rooms in Use x Floor"] = dframe_meeting[
    (dframe_meeting["Type"] == "Meeting Room")].groupby(["Building","Week", "Day", "Time","Floor"])["Hours in Use"].transform("sum")

# Create a new data frame and import relevant columns
df_meeting_all_floors = dframe_meeting[["Week", "Day", "Time", "Floor", "Meeting Rooms in Use x Floor", "Number of Meeting Rooms x Floor"]].dropna()
df_meeting_all_floors = df_meeting_all_floors.drop_duplicates()


# Create a column for time slot

df_meeting_all_floors["Week"] = df_meeting_all_floors["Week"].astype(str)
df_meeting_all_floors["Time Slot"] = df_meeting_all_floors["Time"] + ", " + df_meeting_all_floors["Day"] + ", Week " + df_meeting_all_floors["Week"]
# sum all rooms in use per time slot and recreate table
df_meeting_all_floors = df_meeting_all_floors.groupby(["Time Slot", "Week","Day","Time"])["Meeting Rooms in Use x Floor"].sum().reset_index()

df_meeting_all_floors = df_meeting_all_floors.astype({"Week": CategoricalDtype(categories=["1", "2", "3"], ordered=True),
                                                      "Day": CategoricalDtype(categories=["Monday","Teusday", "Wednesday","Thursday"], ordered=True),
                                                      "Time": CategoricalDtype(categories=["8am","9am","10am","11am","12pm","1pm","2pm","3pm","4pm","5pm","6pm","7pm"], ordered=True)})
df_meeting_all_floors.sort_values(by=["Week","Day","Time"], inplace=True)


# Using Plotly Graph Objects to create a bar chart including customized labels, colors, and widths
fig_meeting_rooms_all_floors = go.Figure(data=[go.Bar(x=df_meeting_all_floors["Time Slot"],
                                                      y=df_meeting_all_floors["Meeting Rooms in Use x Floor"],
                                                      marker_color="#26A2ED")],)

fig_meeting_rooms_all_floors.update_layout(title_text="Number of Meeting Rooms in Use for All Floors",
                                            template="simple_white",
                                            bargap=0.03,
                                            showlegend=False,
                                            height=700,
                                            width=1000,
                                            yaxis_range=[0, df_meeting_all_floors["Meeting Rooms in Use x Floor"].max()])

fig_meeting_rooms_all_floors.update_yaxes(title_text="Number of Meeting Rooms in Use")
fig_meeting_rooms_all_floors.update_xaxes(title_text="Time")



fig_meeting_rooms_all_floors.add_hline(y=df_meeting_all_floors["Meeting Rooms in Use x Floor"].median())

# Adding the line for average population
med_meeting_rooms_all_floors = df_meeting_all_floors["Meeting Rooms in Use x Floor"].median()
fig_meeting_rooms_all_floors.layout.xaxis2 = go.layout.XAxis(overlaying="x", range=[0, 2], showticklabels=False)
fig_meeting_rooms_all_floors.add_scatter(x=[0, 2], y=[med_meeting_rooms_all_floors, med_meeting_rooms_all_floors], mode="lines+text", xaxis="x2", marker_color="Black",
                                          text="Median: " + str(med_meeting_rooms_all_floors),
                                          textposition="top left",
                                          textfont=dict(color="Black"),
                                          name="citations",
                                          showlegend=False)


fig_meeting_rooms_all_floors.show()
© www.soinside.com 2019 - 2024. All rights reserved.