Python 3.7 Environment
Я хочу создать столбчатую диаграмму с несколькими метками поверх каждой подкатегории, отображаемой как полоса. Данные поступают из файла CSV, и некоторые метки довольно длинные, поэтому они больше ширины полосы. Проблема может быть легко решена путем масштабирования всего графика c таким образом, чтобы полосы стали достаточно большими для меток, но я не могу изменить размер графика в целом. здесь код:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
dataset = 'Number'
dataFrame: pd.DataFrame = pd.read_csv('my_csv_file_with_data.csv', sep=',', header=2)
dataFrame['FaultDuration [h]'] = dataFrame['DurationH']
# ***********************************************************
# Data gymnastics to transform data in desired format
# determine the main categories
mainCategories: pd.Series = dataFrame['MainCategory']
mainCategories = mainCategories.drop_duplicates()
mainCategories = mainCategories.sort_values()
print('Main Categories: '+ mainCategories)
# subcategories
subCategories: pd.Series = pd.Series(data=dataFrame['SubCategorie'].drop_duplicates().sort_values().values)
subCategories = subCategories.sort_values()
print('Sub Categories: '+ subCategories)
# Build new frame with subcategories as headers
columnNames = pd.Series(data=['SubCategory2'])
columnNames = columnNames.append(mainCategories)
rearrangedData: pd.DataFrame = pd.DataFrame(columns=columnNames.values)
for subCategory in subCategories:
subset: pd.DataFrame = dataFrame.loc[dataFrame['SubCategorie'] == subCategory]
rearrangedRow = pd.DataFrame(columns=mainCategories.values)
rearrangedRow = rearrangedRow.append(pd.Series(), ignore_index=True)
rearrangedRow['SubCategory2'] = subCategory
for mainCategory in mainCategories:
rowData: pd.DataFrame = subset.loc[subset['MainCategorie'] == mainCategory]
if (rowData is not None and rowData.size > 0):
rearrangedRow[mainCategory] = float(rowData[dataset].values)
else:
rearrangedRow[mainCategory] = 0.0
rearrangedData = rearrangedData.append(rearrangedRow, ignore_index=True)
# *********************************************************************
# here the plot is created:
thePlot = rearrangedData.set_index('SubCategory2').T.plot.bar(stacked=True, width=1, cmap='rainbow')
thePlot.get_legend().remove()
labels = []
# *************************************************************
# creation of bar patches and labels in bar chart
rowIndex = 0
for item in rearrangedData['SubCategory2']:
colIndex = 0
for colHead in rearrangedData.columns:
if colHead != 'SubCategory2':
if rearrangedData.iloc[rowIndex, colIndex] > 0.0:
label = item + '\n' + str(rearrangedData.iloc[rowIndex, colIndex])
labels.append(item)
else:
labels.append('')
colIndex = colIndex + 1
rowIndex = rowIndex + 1
patches = thePlot.patches
for label, rect in zip(labels, patches):
width = rect.get_width()
if width > 0:
x = rect.get_x()
y = rect.get_y()
height = rect.get_height()
thePlot.text(x + width/2., y + height/2., label, ha='center', va='center', size = 7 )
# Up to here things work like expected...
# *******************************************************
# now I want to produce output in the desired format/size
# things I tried:
1) thePlot.figure(figsize=(40,10)) <---- Fails with error 'Figure' object is not callable
2) plt.figure(figsize=(40,10)) <---- Creates a second, empty plot of the right size, but bar chart remains unchanged
3) plt.figure(num=1, figsize=(40,10)) <---- leaves chart plot unchanged
plt.tight_layout()
plt.show()
Объект «thePlot» - это AxesSubplot. Как мне получить правильно масштабированный график?