Eli Turasky
Eli Turasky

Reputation: 1061

Drawing lines between two points with twinaxes

I have followed this example (Drawing lines between two plots in Matplotlib) but am running into problems. I believe it has something to do with the fact that I essentially have two different y points, but am not sure how to amend the code to fix it. I would like the line to start at one point and end at the other point directly below it, as well as plotting for all lines.

fig=plt.figure(figsize=(22,10), dpi=150)
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()
n = 10
y1 = np.random.random(n)
y2 = np.random.random(n) + 1
x1 = np.arange(n)
ax1.scatter(x1, y1)
ax2.scatter(x1, y2)

i = 1
xy = (x1[i],y1[i])
con = ConnectionPatch(xyA=xy, xyB=xy, coordsA="data", coordsB="data",
                  axesA=ax1, axesB=ax2, color="red")
ax2.add_artist(con)

ax1.plot(x1[i],y1[i],'g+',markersize=12)
ax2.plot(x1[i],y1[i],'g+',markersize=12)

Failed attempt

Upvotes: 0

Views: 55

Answers (1)

trsvchn
trsvchn

Reputation: 8991

Just iterate over zipped (x, y1, y2):

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch

fig = plt.figure(figsize=(10, 5), dpi=100)
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()
n = 10
y1 = np.random.random(n)
y2 = np.random.random(n) + 1
x1 = np.arange(n)

# I add some colors blue for left y-axis, red for right y-axis
ax1.scatter(x1, y1, c='b')  
ax2.scatter(x1, y2, c='r')

# Now iterate over paired x, and 2 y values:
for xi, y1i, y2i in zip(x1, y1, y2):
    con = ConnectionPatch(
        xyA=(xi, y1i),
        xyB=(xi, y2i),
        coordsA="data",
        coordsB="data",
        axesA=ax1,
        axesB=ax2,
        color='g',
    )
    ax1.add_artist(con)
plt.show()

Out: img

Upvotes: 1

Related Questions