I would like to plot data in a dictionary called data. For each category, I'd like to have subcategory of positive and negative. The problem is that each of these should have multiple values. The end result should be like this:

data = {'A': {'pos': [3, 5, 7], 'neg': [8, 10, 11]},
'B': {'pos': [4, 7, 8], 'neg': [7, 10, 12]},
'C': {'pos': [1, 3, 4], 'neg': [2, 8, 8]}}
Is this even possible?
CodePudding user response:
The difficulty here is that you lack an index for your pos and neg values.
You can create one from scratch:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dict = {'A': {'pos': [3, 5, 7], 'neg': [8, 10, 11]},
'B': {'pos': [4, 7, 8], 'neg': [7, 10, 12]},
'C': {'pos': [1, 3, 4], 'neg': [2, 8, 8]}}
shift = 0
for key in dict:
dict[key]['index_pos'] = np.arange(0 shift,len(dict[key]['pos']) shift)
dict[key]['index_neg'] = np.arange(0 len(dict[key]['pos']) shift,len(dict[key]['neg']) len(dict[key]['pos']) shift)
shift =len(dict[key]['neg']) len(dict[key]['pos'])
Then convert your dictionary to a pandas dataframe:
list_of_dataframes = []
for i, key in enumerate(dict):
print(key)
df_temp = pd.DataFrame.from_dict(dict[key])
df_temp['group'] = i
list_of_dataframes.append(df_temp)
df = pd.concat(list_of_dataframes)
And plot the pos and neg values using matplotlib bar function:
plt.bar(df['index_pos'], df['pos'], color='green', label='pos')
plt.bar(df['index_neg'], df['neg'], color='red', label='neg')
plt.legend()
Et voilà:
I will leave it to you to fix the labels and the spacing between categories (hint: try adjusting the shift variable).

