Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting a pie chart out of a dictionary

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?

like image 407
newbie1 Avatar asked Jun 26 '20 11:06

newbie1


People also ask

How do you make a pie chart in Python?

Creating Pie Chart Matplotlib API has pie() function in its pyplot module which create a pie chart representing the data in an array. Parameters: data represents the array of data values to be plotted, the fractional area of each slice is represented by data/sum(data).

How do you plot a pie chart?

Steps of construction of pie chart for a given data: Draw a circle of any radius. Starting with the horizontal radius, draw radii, making central angles corresponding to the values of respective components. Repeat the process for all the components of the given data.


4 Answers

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()
like image 176
xszym Avatar answered Nov 15 '22 03:11

xszym


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.

like image 44
Ibtihaj Tahir Avatar answered Nov 15 '22 02:11

Ibtihaj Tahir


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()
like image 35
Crebain Avatar answered Nov 15 '22 04:11

Crebain


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()]
like image 32
Douglas Ferreira Avatar answered Nov 15 '22 02:11

Douglas Ferreira