Я пытаюсь создать гистограмму с накоплением, используя Matplotlib. График, кажется, складывается просто отлично, но при отображении результата появляются странные пробелы. Я думаю, это потому, что я устанавливаю атрибут "bottom =" plt.bar для текущего набора данных, в то время как из примера кода выглядит так, как будто вы должны установить "bottom =" в сумме предыдущих наборов данных. Мои попытки сделать это не дали ничего, кроме пустых графиков, поэтому я решил, что я мог бы также загрузить код, который показывает графики с нежелательным пробелом.
Есть какие-нибудь идеи по обходу этой проблемы?
from pandas.api.types import CategoricalDtype
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv('D:/GIT/GSURFizDataProcessing/fizdata/fizmay2019data.txt', sep="\t", header=None)
#df.to_csv('D:/GIT/GSURFizDataProcessing/fizdata/fizproblemdata.csv')
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
df = df.loc[:,[0,1,2]]
df.columns = ['date', 'sensor', 'value']
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M:%S.%f')
df['Day of Week'] = df['date'].dt.weekday_name
weekdays = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
cat_type = CategoricalDtype(categories=weekdays, ordered=True)
df['Day of Week'] = df['Day of Week'].astype(cat_type)
motionSensors = ["D8MotionA", "D14MotionA",
"D14MotionB",
"D15AMotionA", "D15BMotionA", "D15MotionA","D15MotionB",
"D15MotionC","D18MotionA","D21AMotionA","D21MotionA",
"D4MotionA","D6MotionA","D22MotionA"]
df = df[df['sensor'].isin(motionSensors)]
df['TimeDelta'] = 0
listOfColors = {}
for i in motionSensors:
listOfColors[i] = np.random.rand(3, )
usedLabels = []
for day in weekdays:
datasets = []
for sensor in motionSensors:
print("NEW SENSOR ", sensor)
parsedDf = df[(df['Day of Week']==day) & (df['sensor']==sensor)]
firstValue = parsedDf["value"].iloc[0]
if firstValue == "OFF":
parsedDf.drop(parsedDf.head(1).index, inplace=True)
# Get seconds
parsedDf['TimeDelta'] = parsedDf['date'].shift(-1) - parsedDf['date']
parsedDf.iloc[::2]
parsedDf = parsedDf[parsedDf['TimeDelta'] < timedelta(days=2)]
parsedDf.drop(parsedDf.tail(1).index, inplace=True)
parsedDf["TimeDelta"] / np.timedelta64(1, 's')
summed = parsedDf["TimeDelta"].sum()
summed = summed.total_seconds()
summed = summed / 3600
#labelText = sensor + ": " + ("%.2f" % sum) + " hrs"
#print(labelText)
if sensor in usedLabels:
plt.bar(day, summed, 0.4, color=listOfColors[sensor], bottom=summed)
else:
plt.bar(day, summed, 0.4, color=listOfColors[sensor], label=sensor, bottom=summed)
usedLabels.append(sensor)
datasets.append(summed)
plt.title("Fiz May 2019 Usage Data")
plt.ylabel("Time Spent (hr)")
ax = plt.subplot(111)
chartBox = ax.get_position()
ax.set_position([chartBox.x0, chartBox.y0, chartBox.width*0.6, chartBox.height])
ax.legend(loc='upper center', bbox_to_anchor=(1.45, 0.8), shadow=True, ncol=1)
plt.legend(loc='upper center', bbox_to_anchor=(1.45, 0.8))
plt.show()
