Reputation: 199
I have a dictionary:
{'DATE': 65,
'ORG': 93,
'PERSON': 62,
'GPE': 18,
'PRODUCT': 18,
'FAC': 4,
'CARDINAL': 50,
'ORDINAL': 15,
'NORP': 10,
'MONEY': 3,
'PERCENT': 2,
'TIME': 5,
'LOC': 5,
'QUANTITY': 2}
All I want is to get this plotted in a pie chart which shows the percentage distribution of these items. How can i plot this????
I have tried the solution here: Trying to create a pie and bar chart from the data below
So i used the code which was published there as a solution:
amount_of_TP_ner_tags # this is the dictionary I want to plot. see above
# dont use values inside a list as column values for a dataframe
browser2 = {}
[browser2.update({key : val[0]}) for key, val in amount_of_TP_ner_tags.items()]
x = pd.Series(browser2)
y = pd.Series.sort_values(x)
z = pd.DataFrame(y)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(8,4))
# you need to specify which column of the dataframe you want to plot (here 0)
z.plot(y=0, kind = 'pie', ax = axes[0])
z.plot(kind = 'bar', ax = axes[1])
axes[0].set_aspect("equal") # make aspect equal (such that circle is not eliptic)
#place the legend at a decent position
axes[0].legend(loc=1, bbox_to_anchor= (1,0.2), fontsize=11)
plt.tight_layout()
plt.show()
But I receive an error message:
TypeError Traceback (most recent call last)
<ipython-input-258-7ca72d2d0ca4> in <module>
1 # dont use values inside a list as column values for a dataframe
2 browser2 = {}
----> 3 [browser2.update({key : val[0]}) for key, val in amount_of_TP_ner_tags.items()]
4
5 x = pd.Series(browser2)
<ipython-input-258-7ca72d2d0ca4> in <listcomp>(.0)
1 # dont use values inside a list as column values for a dataframe
2 browser2 = {}
----> 3 [browser2.update({key : val[0]}) for key, val in amount_of_TP_ner_tags.items()]
4
5 x = pd.Series(browser2)
TypeError: 'int' object is not subscriptable
So how can I plot this?
Upvotes: 11
Views: 17694
Reputation: 290
import matplotlib.pyplot as plt
your_data = {'DATE': 65,
'ORG': 93,
'PERSON': 62,
'GPE': 18,
'PRODUCT': 18,
'FAC': 4,
'CARDINAL': 50,
'ORDINAL': 15,
'NORP': 10,
'MONEY': 3,
'PERCENT': 2,
'TIME': 5,
'LOC': 5,
'QUANTITY': 2}
plt.pie([float(your_data[v]) for v in your_data], labels=[str(k) for k in your_data], autopct='%1.1f%%')
plt.show()
Upvotes: 2
Reputation: 636
It's very easy
Step1: Extract the labels and values from the dictionary
# Get the Keys and store them in a list
labels = list(yourData.keys())
# Get the Values and store them in a list
values = list(yourData.values())
Step2: Simple Call the matplotlib.pyplot
's pie method.
import matplotlib.pyplot as plt
plt.pie(values, labels=labels)
plt.show()
And you will be good to go.
Upvotes: 11
Reputation: 747
Your error is not in plotting, you are trying to access the index of an integer.
try this:
browser2 = {}
[browser2.update({key : val}) for key, val in amount_of_TP_ner_tags.items()]
Upvotes: 1
Reputation: 938
The simplest way is to use matplotlib pie chart
import matplotlib.pyplot as plt
your_data = {'DATE': 65,
'ORG': 93,
'PERSON': 62,
'GPE': 18,
'PRODUCT': 18,
'FAC': 4,
'CARDINAL': 50,
'ORDINAL': 15,
'NORP': 10,
'MONEY': 3,
'PERCENT': 2,
'TIME': 5,
'LOC': 5,
'QUANTITY': 2}
# Data to plot
labels = []
sizes = []
for x, y in your_data.items():
labels.append(x)
sizes.append(y)
# Plot
plt.pie(sizes, labels=labels)
plt.axis('equal')
plt.show()
Upvotes: 18