yizi
yizi

Reputation: 23

How to set all the four axes with matplotlib

https://i.sstatic.net/T5BbL.png

I want to draw a picture like this one, the top and right axes have different labels and ticks, anyone can help me?

Upvotes: 2

Views: 1152

Answers (3)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339230

Since both datasets are completely independent, one would probably not use twin axes here. Instead, just use two different axes.

import numpy as np
import matplotlib.pyplot as plt

# Create some mock data
x1 = np.linspace(0,1,11)
y1 = np.random.rand(11)
x2 = np.linspace(1,0,101)
y2 = np.random.rand(101)*20+20


fig, ax1 = plt.subplots()
ax2 = fig.add_subplot(111, label="second axes")
ax2.set_facecolor("none")

ax1.set_xlabel('x1', color='red')
ax1.set_ylabel('y1', color='red')
ax1.plot(x1, y1, color='red')
ax1.tick_params(colors='red')

ax2.set_xlabel('x2', color='blue')
ax2.set_ylabel('y2', color='blue')
ax2.plot(x2, y2, color='blue')
ax2.xaxis.tick_top()
ax2.xaxis.set_label_position('top') 
ax2.yaxis.tick_right()
ax2.yaxis.set_label_position('right')
ax2.tick_params(colors='blue')

for which in ["top", "right"]:
    ax2.spines[which].set_color("blue")
    ax1.spines[which].set_visible(False)
for which in ["bottom", "left"]:
    ax1.spines[which].set_color("red")
    ax2.spines[which].set_visible(False)

plt.show()

enter image description here

Upvotes: 1

alec_djinn
alec_djinn

Reputation: 10789

To double both axes you have to use ax1.twinx().twiny().

Here an example:

# Create some mock data
x1 = np.arange(0, 10, 1)
y1 = [random.randint(1,5) for n in x1]
#print(x1,y1)

x2 = np.arange(0, 100, 10)
y2 = [random.randint(10,50) for n in x2]
#print(x2,y2)

fig, ax1 = plt.subplots()

ax1.set_xlabel('x1', color='red')
ax1.set_ylabel('y1', color='red')
ax1.plot(x1, y1, color='red')
ax1.tick_params(axis='both', labelcolor='red')

ax2 = ax1.twinx().twiny() #here is the trick!

ax2.set_xlabel('x2', color='blue')
ax2.set_ylabel('y2', color='blue')
ax2.plot(x2, y2, color='blue')
ax2.tick_params(axis='both', labelcolor='blue') #y2 does not get blue... can't yet figure out why

plt.show()

Here the result:

enter image description here

Upvotes: 2

Mohsen_Fatemi
Mohsen_Fatemi

Reputation: 3391

You should use twinx and twiny functions, take a look at this link

Upvotes: 0

Related Questions