Daniel
Daniel

Reputation: 263

How to plot keys and values from dictionary in histogram

I need to plot a histogram with the following dictionary

x = {5:289, 8:341, 1:1565, 4:655, 2:1337, 9:226, 7:399, 3:967, 6:405}

I need first keys be ordered from 1 to 9. Then the values will be plotted in the histogram, showing a maximum probability of 1.0. I have tried the following (plus other stuff).

import matplotlib.pyplot as plt
import numpy as np

plt.hist(x.keys(), x.values(), color='g', label = "Real distribution")
plt.show()

Or

plt.hist (x, bins = np.arange(9), color = 'g', label = "Real distribution")
plt.show()

Or

fsn_count_ = sorted(fsn_count)

plt.hist (fsn_count_, bins = np.arange(9), color = 'b', label = "Real distribution")
plt.plot ([0] + bf, color = 'g', label = "Benford Model")
plt.xlabel ('Significant number')
plt.ylabel ('Percentage')
plt.xlim (1,9)
plt.ylim (0,1)
plt.legend (bbox_to_anchor = (1, 1), loc="upper right", borderaxespad=0.)
plt.savefig (country_ + '.png')
plt.show ()
plt.clf ()

distribution_sum = sum(bf)
print('The sum of percentage distribution is:', distribution_sum)

Upvotes: 4

Views: 15671

Answers (3)

DavidG
DavidG

Reputation: 25362

From your comment, it seems that a bar chart would be a better way to display the data.

The probability can be found by dividing the values of the dictionary by the sum of the values:

import matplotlib.pyplot as plt
import numpy as np

x = {5:289, 8:341, 1:1565, 4:655, 2:1337, 9:226, 7:399, 3:967, 6:405}

keys = x.keys()
vals = x.values()

plt.bar(keys, np.divide(list(vals), sum(vals)), label="Real distribution")

plt.ylim(0,1)
plt.ylabel ('Percentage')
plt.xlabel ('Significant number')
plt.xticks(list(keys))
plt.legend (bbox_to_anchor=(1, 1), loc="upper right", borderaxespad=0.)

plt.show()

enter image description here

Upvotes: 6

Jakob Lovern
Jakob Lovern

Reputation: 1341

I'm sorry in advance for how terribly un-pythonic and weird my code is. I'm not too strong with mathplot or with numpy.

If you used the_keys = list(set(dict.keys())) to get a set of the keys (ordered, because it was a set. Like I said in comments, I'm doing some pretty ugly hacking here.) you can then do the_values = [x[i] for i in the_keys] to get a list representation of the dictionary ordered by keys. Then plot it with

plt.hist(the_keys, the_values, color='g', label = "Real distribution")
plt.show()

Upvotes: -1

Ajax1234
Ajax1234

Reputation: 71451

Sort your data before plotting:

import matplotlib.pyplot as plt
import numpy as np
x = {5:289, 8:341, 1:1565, 4:655, 2:1337, 9:226, 7:399, 3:967, 6:405}
new_x = sorted(x.items(), key=lambda x:x[0])
plt.hist([i[-1] for i in new_x], normed=True, bins=len(new_x), color='g', label = "Real distribution")
plt.show()

enter image description here

Upvotes: 2

Related Questions