durbachit
durbachit

Reputation: 4886

How to make axis tick labels visible on the other side of the plot in gridspec?

Plotting my favourite example dataframe,which looks like this:

      x   val1   val2   val3
0    0.0  10.0   NaN    NaN
1    0.5  10.5   NaN    NaN
2    1.0  11.0   NaN    NaN
3    1.5  11.5   NaN  11.60
4    2.0  12.0   NaN  12.08
5    2.5  12.5  12.2  12.56
6    3.0  13.0  19.8  13.04
7    3.5  13.5  13.3  13.52
8    4.0  14.0  19.8  14.00
9    4.5  14.5  14.4  14.48
10   5.0   NaN  19.8  14.96
11   5.5  15.5  15.5  15.44
12   6.0  16.0  19.8  15.92
13   6.5  16.5  16.6  16.40
14   7.0  17.0  19.8  18.00
15   7.5  17.5  17.7    NaN
16   8.0  18.0  19.8    NaN
17   8.5  18.5  18.8    NaN
18   9.0  19.0  19.8    NaN
19   9.5  19.5  19.9    NaN
20  10.0  20.0  19.8    NaN

I have two subplots, for some other reasons it is best for me to use gridspec. The plotting code is as follows (it is quite comprehensive, so I would like to avoid major changes in the code that otherwise works perfectly and just doesn't do one unimportant detail):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec
import matplotlib as mpl

df = pd.read_csv('H:/DocumentsRedir/pokus/dataframe.csv', delimiter=',')

# setting limits for x and y
ylimit=(0,10)
yticks1=np.arange(0,11,1)
xlimit1=(10,20)
xticks1 = np.arange(10,21,1)

# general plot formatting (axes colour, background etc.)
plt.style.use('ggplot')
plt.rc('axes',edgecolor='black')
plt.rc('axes', facecolor = 'white')
plt.rc('grid', color = 'grey')
plt.rc('grid', alpha = 0.3) # alpha is percentage of transparency
colours = ['g','b','r']
title1 = 'The plot'

# GRIDSPEC INTRO - rows, cols, distance of individual plots
fig = plt.figure(figsize=(6,4))
gs=gridspec.GridSpec(1,2, hspace=0.15, wspace=0.08,width_ratios=[1,1])

## SUBPLOT of GRIDSPEC with lines 
# the first plot
axes1 = plt.subplot(gs[0,0])  

for count, vals in enumerate(df.columns.values[1:]):

    X = np.asarray(df[vals])

    h = vals
    p1 = plt.plot(X,df.index,color=colours[count],linestyle='-',linewidth=1.5,label=h) 

# formatting
p1 = plt.ylim(ylimit) 
p1 = plt.yticks(yticks1, yticks1, rotation=0) 
p1 = axes1.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.1))
p1 = plt.setp(axes1.get_yticklabels(),fontsize=8)
p1 = plt.gca().invert_yaxis()
p1 = plt.ylabel('x [unit]', fontsize=14)
p1 = plt.xlabel("Value [unit]", fontsize=14)
p1 = plt.tick_params('both', length=5, width=1, which='minor', direction = 'in')
p1 = axes1.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.1))
p1 = plt.xlim(xlimit1)
p1 = plt.xticks(xticks1, xticks1, rotation=0)
p1 = plt.setp(axes1.get_xticklabels(),fontsize=8)
p1 = plt.legend(loc='best',fontsize = 8, ncol=2)   #

# the second plot (something random)
axes2 = plt.subplot(gs[0,1]) 

for count, vals in enumerate(df.columns.values[1:]):

   nonans = df[vals].dropna()
   result=nonans-0.5

   p2 = plt.plot(result,nonans.index,color=colours[count],linestyle='-',linewidth=1.5)

p2 = plt.ylim(ylimit)
p2 = plt.yticks(yticks1, yticks1, rotation=0)
p2 = axes2.yaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.1))
p2 = plt.gca().invert_yaxis()
p2 = plt.xlim(xlimit1)
p2 = plt.xticks(xticks1, xticks1, rotation=0)
p2 = axes2.xaxis.set_minor_locator(mpl.ticker.MultipleLocator(0.1))
p2 = plt.setp(axes2.get_xticklabels(),fontsize=8)
p2 = plt.xlabel("Other value [unit]", fontsize=14)
p2 = plt.tick_params('x', length=5, width=1, which='minor', direction = 'in')
p2 = plt.setp(axes2.get_yticklabels(), visible=False)

fig.suptitle(title1, size=16)
plt.show()

However, is it possible to show the y tick labels of the second subplot on the right hand side? The current code produces this:

enter image description here

And I would like to know if there is an easy way to get this: enter image description here

Upvotes: 2

Views: 7347

Answers (2)

durbachit
durbachit

Reputation: 4886

No, ok, found out it is precisely what I wanted. I want the TICKS to be on BOTH sides, just the LABELS to be on the right. The solution above removes my ticks from the left side of the subplot, which doesn't look good. However, this answer seems to get the right solution :) To sum up: to get the ticks on both sides and labels on the right, this is what fixes it:

axes2.yaxis.tick_right(‌​) 
axes2.yaxis.set_ticks_p‌​osition('both')

And if you need the same for x axis, it's axes2.xaxis.tick_top(‌​)

Upvotes: 4

rafa
rafa

Reputation: 21

try something like

axes2.yaxis.tick_right()

Just look around Python Matplotlib Y-Axis ticks on Right Side of Plot.

Upvotes: 2

Related Questions