0

I want to plot the bar plot, here is the data:

large_letter = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
large_num = [52909, 52911, 52912, 52911, 52912, 52912, 52912, 52912, 52912, 52911]
small_letter = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
small_num = [1872, 1873, 1873, 1873, 1873, 1872, 1872, 1872, 1872, 1872]

And I want to plot 2 subplots to show each letters' number in each list, so here is my code

import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.bar(large_letter, large_num)
ax2.bar(small_letter, small_num)

But it returned the following error:

ValueErrorTraceback (most recent call last)
<ipython-input-90-e23f798dd50c> in <module>()
     20 fig, (ax1, ax2) = plt.subplots(1, 2)
---> 21 ax1.bar(large_letter, large_num)
     22 ax2.bar(small_letter, small_num)

/usr/lib64/python2.7/site-packages/matplotlib/__init__.pyc in inner(ax, *args, **kwargs)
   1817                     warnings.warn(msg % (label_namer, func.__name__),
   1818                                   RuntimeWarning, stacklevel=2)
-> 1819             return func(ax, *args, **kwargs)
   1820         pre_doc = inner.__doc__
   1821         if pre_doc is None:

/usr/lib64/python2.7/site-packages/matplotlib/axes/_axes.pyc in bar(self, left, height, width, bottom, **kwargs)
   2085                 edgecolor=e,
   2086                 linewidth=lw,
-> 2087                 label='_nolegend_'
   2088                 )
   2089             r.update(kwargs)

/usr/lib64/python2.7/site-packages/matplotlib/patches.pyc in __init__(self, xy, width, height, angle, **kwargs)
    638         Patch.__init__(self, **kwargs)
    639 
--> 640         self._x = float(xy[0])
    641         self._y = float(xy[1])
    642         self._width = float(width)

ValueError: could not convert string to float: A

How can I fix this problem? Thank you!

0

2 Answers 2

3

It tells you exactly what the problem is -- it's trying to convert the first argument to a number. Have a look at the documentation for matplotlib.pyplot.bar. It's a bit unintuitive, but the first argument is a coordinate for the left side of the bar, not the label of the bar. I'm not sure, but you probably needing the tick_label argument to name the bars.

Try something like

# Specify the width of each of the bars since we need it for calculating left of
# bars. The default is 0.8
width = 1.0

# Find the lefts of the bars. You can change this to leave a gap between bars
lefts = [x * width for x, _ in enumerate(large_num)]

# Create bar graph
ax1.bar(lefts, large_num, width=width, tick_label=large_letter)
Sign up to request clarification or add additional context in comments.

1 Comment

Had the same error as I referenced this link on their documentation, but this works perfectly matplotlib.org/3.1.1/gallery/lines_bars_and_markers/…
1

Like danielu13 says. Something like this should work.

ax1.bar(range(len(large_letter)), large_num, tick_label=large_letter)
ax2.bar(range(len(small_letter)), small_num, tick_label=small_letter)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.