Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

graphing multiple types of plots (line, scatter, bar etc) in the same window

I'm trying to graph two types of plots in the same window (i.e. a line plot, and a scatter plot). The data being plotted in the line graph (first plot) are floating numerical values representing climate indices (Y) vs. decimal years (X). The second plot that I would like to be a 'scatter'ed is much the same, but with floating numerical values representing stream flows (Y) vs. decimal years (X). I've tried to accomplish this as follows by using a twin x axis and a second, parasite y axis for the scatter plot:

    import mpl_toolkits
    from mpl_toolkits.axes_grid1 import host_subplot
    import matplotlib.pyplot as plt

    host = host_subplot(111)
    par = host.twinx()

    host.set_xlim(1880, 2020)
    host.set_ylim(-5, 10)

    host.set_xlabel("Time")
    host.set_ylabel("PDSI Region 01")
    par.set_ylabel("Minimum 10% Annual 7-day Non-exceedance Flow (cfs)")

    x1 = timearray
    y1 = pdsiarray01
    x2 = upAmm_yr
    y2 = upAmm_min

    p1, = host.plot(x1, y1, label="PDSI01")
    p2, = par.scatter(x2, y2, label="Annual Lowflow Upper Amm")

    par.set_ylim(30, 60)

    host.legend()
    host.axis["left"].label.set_color(p1.get_color())
    par.axis["right"].label.set_color(p2.get_color())

    plt.draw()
    plt.show()

and I get the error code:

    TypeError: cannot perform reduce with flexible type

This code works fine when I replace scatter with plot in the line that starts with p2, but produces a second line plot. The ultimate reason I want it scattered is that there are many fewer points to be plotted in the second dataset, and the lines connecting them are distracting and 'messy' (when I all need is to highlight an instant in time). A bar plot instead of a scatter would work too. Any suggestions or help would be much appreciated!

like image 586
hdevs Avatar asked Sep 08 '11 18:09

hdevs


People also ask

How do you plot multiple lines in Python?

You can plot multiple lines from the data provided by an array in python using matplotlib. You can do it by specifying different columns of the array as the x and y-axis parameters in the matplotlib. pyplot. plot() function.


1 Answers

Why not just use plot in both cases?

import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Generate some random data
time = mdates.drange(datetime.datetime(2010, 1, 1), 
                     datetime.datetime(2011, 1, 1),
                     datetime.timedelta(days=5))
y1 = np.cumsum(np.random.random(time.size) - 0.5)
y2 = np.cumsum(np.random.random(time.size) - 0.5)
y2 = y2 * 20 + 10

# Plot things up...
fig = plt.figure()
host = fig.add_subplot(111)
par = host.twinx()

host.set_ylabel('One Thing')
par.set_ylabel('Another')

line1, = host.plot(time, y1)
line2, = par.plot(time, y2, 'go')
host.legend([line1, line2], ['Item 1', 'Item 2'])

host.xaxis_date()

plt.show()

enter image description here

like image 131
Joe Kington Avatar answered Sep 20 '22 16:09

Joe Kington