Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot arrays of different lengths

I'm plotting the error vs. number of iterations for three different algorithms. They take a different number of iterations to compute, so the arrays are of different length. Yet I want to plot all three lines on the same plot. Currently, I get this error when I use the following code:

import matplotlib.pyplot as plt

plt.plot(ks, bgd_costs, 'b--', sgd_costs, 'g-.', mbgd_costs, 'r')
plt.title("Blue-- = BGD, Green-. = SGD, Red=MBGD")
plt.ylabel('Cost')
plt.xlabel('Number of updates (k)')
plt.show()

The error:

    plt.plot(ks, bgd_costs, 'b--', sgd_costs, 'g-.', mbgd_costs, 'r')
  File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/pyplot.py", line 2995, in plot
    ret = ax.plot(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/axes/_axes.py", line 1331, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/axes/_base.py", line 312, in _grab_next_args
    for seg in self._plot_args(remaining[:isplit], kwargs):
  File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/axes/_base.py", line 281, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "/Library/Python/2.7/site-packages/matplotlib-1.4.x-py2.7-macosx-10.9-intel.egg/matplotlib/axes/_base.py", line 223, in _xy_from_xy
    raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension

UPDATE

Thanks to @ibizaman's answer, I made this plot: enter image description here

like image 909
Rose Perrone Avatar asked Mar 02 '14 00:03

Rose Perrone


1 Answers

If I'm not mistaken, using plot like you did plots 3 graphs with, for each, ks as x and bgd_costs, sgd_costs and mbgd_costs as 3 different y. You obviously need x and y to have the same length and like you and the error says, it's not the case.

To make it work, you could add a "hold" and a split the display of the plots:

import matplotlib.pyplot as plt

plt.hold(True)
plt.plot(bgds, bgd_costs, 'b--')
plt.plot(sgds, sgd_costs, 'g-.')
plt.plot(mgbds, mbgd_costs, 'r')
plt.title("Blue-- = BGD, Green-. = SGD, Red=MBGD")
plt.ylabel('Cost')
plt.xlabel('Number of updates (k)')
plt.show()

Note the different x axes.

If you don't add a hold, every plot will erase the figure first.

like image 139
ibizaman Avatar answered Sep 21 '22 01:09

ibizaman