Python Forum
matplotlib x axis range goes over the set range - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: matplotlib x axis range goes over the set range (/thread-35591.html)



matplotlib x axis range goes over the set range - Pedroski55 - Nov-20-2021

I am just trying to do some simple plots, nothing fancy.

So I am trying y = x**2

I thought I set x in the range -4 to +4 with: x = np.arange(-4, 4, 0.2), but I get range 0 to 40 for x. (I suppose there are 40 0.2s in 8)

I would like the zero on the x-axis to coincide with the zero on the y-axis.

2 small problems:

1. How do I set x-axis zero and y-axis zero in the same place?
Ideally, x and y zero should be in the centre of the figure, so I see -4 to +4 on both axes.
2. How can I fix the range of x? (I would like a small interval in the range in order to give a smooth curve.)

def tp():
    fig = plt.figure(figsize=(6, 6))
    x = np.arange(-4, 4, 0.2)
    y = x**2    
    ax = fig.add_subplot(121)
    #ax2 = fig.add_subplot(122)
    #ax.fig(num='This is the title')

    # Move left y-axis and bottom x-axis to centre, passing through (0,0)
    ax.spines['left'].set_position('center')
    ax.spines['bottom'].set_position('zero')
    # Eliminate upper and right axes
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')

    # Show ticks in the left and lower axes only
    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')

    ax.set_title('Full view')
    ax.plot(y, color='blue', label='y = x^2')
    
    plt.xlabel("X axis")
    plt.ylabel("Y = x^2")
    plt.legend()
    plt.show()



RE: matplotlib x axis range goes over the set range - deanhystad - Nov-20-2021

x = np.arange(-4, 4, 0.2) returns a list of 40 numbers starting at -4 and ending at 3.8, incrementing by 0.2. If it didn't you wouldn't get the values you are for y. Your problem is you are not plotting x vs y. You are plotting y and matplotlib is providing values for x.

Next time you have a problem like this LOOK AT THE VALUES. Print x and y and you would realize they were both correct and the problem must be you weren't doing the plot correctly. Then you would probably notice "Oh, I didn't include x in the plot command. I probably need to do that."


RE: matplotlib x axis range goes over the set range - Pedroski55 - Nov-20-2021

Thanks!

I took that from an example I found. Thought it must be the way to go.

Whoever wrote the example did not put x in ax.plot(x, y, color='blue', label='y = x^2'), just y. I presumed matplotlib used the available x.

Still, x-axis zero and y-axis zero do not coincide, any ideas on that??

The y-axis does not run through the tick which indicates x = zero, there is a slight gap.


RE: matplotlib x axis range goes over the set range - deanhystad - Nov-20-2021

Zero is off center because you have more points left of zero than right of zero. Set your range to -4, 4.1.

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html

Quote:plot(y) # plot y using x as index array 0..N-1

Did you really think that plot somehow surmised that your program, which is completely hidden from plot, contained an array of x axis values that you wanted to use in the plot, and that it should override the documented default behavior of using an index array for x when no x values are provided? Didn't that seem odd? Tutorials are fine as long as you assume half of them are crap. You still have to think and you still need to read the docs.


RE: matplotlib x axis range goes over the set range - Pedroski55 - Nov-20-2021

Well, you have to get used to these things.

When you've done it a few times, you know the ropes.

After I asked the last question, I looked at it again, then I realized what to do. I get what I want now.

Anyway, thanks for your tips and advice, you put me on the right road!


RE: matplotlib x axis range goes over the set range - paul18fr - Nov-21-2021

Here are some changes. For example you can bracket abcissa values or ordinates ones, or you can also implemente Latex formula, and so on. There are many options

import matplotlib.pyplot as plt
import numpy as np
import os

x = np.arange(-4., 4.2, 0.2)
y = x**2  

Path = str(os.path.abspath(''))

fig = plt.figure(figsize=(6, 6))
  
ax = fig.add_subplot(121)
#ax2 = fig.add_subplot(122)
#ax.fig(num='This is the title')
 
# Move left y-axis and bottom x-axis to centre, passing through (0,0)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('zero')
# Eliminate upper and right axes
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
 
# Show ticks in the left and lower axes only
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
 
ax.set_title('Full view')
ax.plot(x, y, color='blue', label=r'Parabola $y = x^2$')
ax.set(xlim=(-4., 4.), ylim=(0., 20.))
 
plt.xlabel("X axis")
plt.ylabel(r"$Y = x^2$")
plt.legend()
# plt.show()
plt.savefig(Path + '/Fig.png',dpi=300)
[Image: xol8.png]