18

I have tried the following:

d = [1,2,3,4,5,6,7,8,9]
f = [0,1,0,0,1,0,1,1,0]
fig = plt.figure()
fig.set_size_inches(30,10)
ax1 = fig.add_subplot(211)
line1 = ax1.plot(d,marker='.',color='b',label="1 row")
ax2 = fig.add_subplot(212)
line1 = ax2.plot(f,marker='.',color='b',label="1 row")
ax1.grid()
ax2.grid()
plt.show()

I got the following output :

output

But I was expecting the following output:
expected output

How I can get the grids across the two plots?

James Z
  • 12,104
  • 10
  • 27
  • 43
Jaffer Wilson
  • 6,683
  • 7
  • 55
  • 125
  • Possible duplicate of [Draw line between two subplots](https://stackoverflow.com/questions/3635411/draw-line-between-two-subplots) – SpghttCd Aug 30 '18 at 11:07
  • @SpghttCd That is for matlab. This question asks for Python – DavidG Aug 30 '18 at 11:09
  • Sorry, I know there was this question for matplotlib in the last few months, so I was too fast on choosing. – SpghttCd Aug 30 '18 at 11:12
  • Possible duplicate of [Plotting a line over several graphs](https://stackoverflow.com/questions/6146290/plotting-a-line-over-several-graphs) – DavidG Aug 30 '18 at 11:12
  • This link [here](https://stackoverflow.com/questions/6146290/plotting-a-line-over-several-graphs) might help. Although it is not gridlines exactly but you can turn them black and thin to make them look like one – Sheldore Aug 30 '18 at 11:13
  • @DavidG: I wouldn't call it duplicate but similar. – Sheldore Aug 30 '18 at 11:14
  • I get this behavior without wanting it in 2.1.1... – Radio Controlled Oct 02 '19 at 07:32

3 Answers3

23

There is no built-in option to create inter-subplot grids. In this case I'd say an easy option is to create a third axes in the background with the same grid in x direction, such that the gridline can be seen in between the two subplots.

import matplotlib.pyplot as plt

d = [1,2,3,4,5,6,7,8,9]
f = [0,1,0,0,1,0,1,1,0]

fig, (ax1,ax2) = plt.subplots(nrows=2, sharex=True)
ax3 = fig.add_subplot(111, zorder=-1)
for _, spine in ax3.spines.items():
    spine.set_visible(False)
ax3.tick_params(labelleft=False, labelbottom=False, left=False, right=False )
ax3.get_shared_x_axes().join(ax3,ax1)
ax3.grid(axis="x")


line1 = ax1.plot(d, marker='.', color='b', label="1 row")
line1 = ax2.plot(f, marker='.', color='b', label="1 row")
ax1.grid()
ax2.grid()
plt.show()

enter image description here

ImportanceOfBeingErnest
  • 289,005
  • 45
  • 571
  • 615
3

Here is my solution:

import matplotlib.pyplot as plt

x1 = [1,2,3,4,5,6,7,8,9]
x2= [0,1,0,0,1,0,1,1,0]
x3= range(-10,0)
# frameon=False removes frames
# fig, (ax1,ax2, ax3) = plt.subplots(nrows=3, sharex=True, subplot_kw=dict(frameon=False))
fig, (ax1,ax2, ax3) = plt.subplots(nrows=3, sharex=True)
# remove vertical gap between subplots
plt.subplots_adjust(hspace=.0)

ax1.grid()
ax2.grid()
ax3.grid()

ax1.plot(x1)
ax2.plot(x2)
ax3.plot(x3)

enter image description here

Without frames subplot_kw=dict(frameon=False):

enter image description here

Aray Karjauv
  • 2,343
  • 2
  • 24
  • 42
2

An option is to create a single plot then just offset the data. So one set plots above the other.

fuyi
  • 2,367
  • 4
  • 21
  • 43
cbradford
  • 21
  • 1
  • 1
    Thank you for your reply. Please can you give an example as you see I have given the data that I am trying to plot. Your answer looks like comment but since you have less score so you are unable to comment. If you give an example then it will be more helpful to everybody. – Jaffer Wilson Aug 11 '21 at 08:43