Постройте гистограмму на основе блоков столбцов - PullRequest
0 голосов
/ 14 июля 2020

У меня есть набор данных (Образец набора данных)

     Contract Sections  A001_Average_By_Block  A002_Average_By_Block
0     O.U20       O1                  0.005               0.002915
1     O.Z20       O1                  0.005               0.002915
2     O.H21       O1                  0.005               0.002915
3     O.M21       O1                  0.005               0.002915
4     O.U21       O2                  0.005               0.004443
5     O.Z21       O2                  0.005               0.004443
6     O.H22       O2                  0.005               0.004443
7     O.M22       O2                  0.005               0.004443
8    S3.U20       S3                  0.500               0.250000
9    S3.Z20       S3                  0.500               0.250000
10   S6.M26       S6                    NaN               3.875000
11   S6.U26       S6                    NaN               3.875000
12   S6.Z26       S6                    NaN               3.875000
13   S6.H27       S6                    NaN               3.875000
14   S9.U26       S9                    NaN               5.250000
15   S9.Z26       S9                    NaN               5.250000
16   F3.U26       F3                  2.000                    NaN
17   F3.Z26       F3                  2.000                    NaN
18   F3.H27       F3                  2.000                    NaN
19   F6.H26       F6                    NaN              10.833333
20   F6.M26       F6                    NaN              10.833333
21   F6.U26       F6                    NaN              10.833333
22   F9.U20       F9                  1.500               1.000000

Я пытаюсь построить график гистограммы A001_Average_By_Block и A002_Average_By_Block

Я могу построить график на основе Контракт, отдельная диаграмма для каждого из продуктов контракта в данных, например диаграмма для O, S, F (и других контрактов в исходном наборе данных), эта только для O.

enter image description here

using the code (please let me know if there is a better way of doing it)

  df_O = df[df['Contract'].str.contains('O')]
ax = df_O[['A001','A002']].plot(kind='bar', title ="Outrights - All data points", figsize=(15, 10), legend=True, fontsize=12)
ax.set_xticklabels(df_O['Contract'], rotation=0)
plt.show()

Now what I'm trying to do is create a separate bar chart on the basis of the Section column. In my case 'O.U20 - O.M21' belongs to O1 block and all of them have the same 'A001_Average_By_Block' value (same in the case of A002_Average_By_Block. Using the same above code I get something like

enter image description here

which is obviously not correct as I want only O1 and O2 in the xticker labels and just two corresponding bars that compares the two mentioned column. I tried this code

pd.value_counts(df_O['Sections']).plot.bar() 

but it is just counting the number of times O1 and O2 occurs. What I want is that if there are 8 blocks of O (sample data shows just two blocks O1, O2) I can get a graph that looks something like this

enter image description here

How can I achieve the desired charts? Basically the structure of data looks something like this (Hopefully this makes sense now)

введите описание изображения здесь

1 Ответ

2 голосов
/ 14 июля 2020
  • Фрейм данных необходимо изменить в зависимости от того, что необходимо построить.
  • Преобразуйте данные в длинный формат с помощью .stack
  • Drop Contract
  • Удалите дубликаты
  • Диапазон значений данных велик, поэтому, если вы не используете шкалу журнала по y, некоторые значения не будут отображаться.
  • Dataframe df - это данные в вопросе
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# dataframe to long format
dfl = df.set_index(['Contract', 'Sections']).stack().reset_index()

# drop
dfl.drop(columns=['Contract'], inplace=True)
dfl.drop_duplicates(inplace=True)

# plot
sns.barplot('Sections', 0, data=dfl, hue='level_2')
plt.yscale('log')

введите описание изображения здесь

...