# modifying xmin value and frame of a plot This post is a wiki. Anyone with karma >750 is welcome to improve it.

Would you please let me now how to modify min value of this plot? I want to make x axis begin from 13, but I can't modify the minimum value of the frame. Now I have no idea what to do....

var('I, r, L_s, z, g, f1, f2, f3, f4, c1, c2, c3, g1, g2, g3, Lg1, Lg2, Lg3, Lg4, Lg5, cp1, cp2, cp3')
f1=1/r^2*exp(-r/50);
f2=2.4/r^2*exp(-r/50);
f3=4/r^2*exp(-r/50);
f4=5/r^2*exp(-r/50);
f5=15/r^2*exp(-r/50);

Lg1=plot(f1, (x, 13, 200),  ticks=[[log(13)/log(10), 10^2],[0.000005, 1/5, 10^-5, 10^-4, 10^-3, 10^-2, 10^-1]], scale=('loglog', 10), ymin=0, ymax=0.1, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=True, legend_label='I=1 cd', frame=True, color='blue', title='L_s(scattering length)=50m');
Lg2=plot(f2, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, legend_label='I=2.4 cd', frame=True, color='black');
Lg3=plot(f3, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, legend_label='I=4 cd', frame=True, color='red');
Lg4=plot(f4, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, legend_label='I=5 cd', frame=True, color='green');
Lg5=plot(f5, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, legend_label='I=15 cd', frame=True, color='violet');
cp4=plot(0.000001, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, frame=True, color='gray', linestyle='dashed');
cp5=plot(0.0005, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, frame=True, color='gray', linestyle='dashed');
Lg1.set_legend_options(loc=1);
cp6=plot(0.00008, (x, 13, 200), ymin=10^-4, ymax=0.3, axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, frame=True, color='gray', linestyle='dashed');
cp3=plot(0.2, (x, 13, 200), ymin=0, ymax=0.1,  axes_labels=['Distance between led and camera [m]','Illuminace on camera sensor[lux]'],axes=False, frame=True, color='red', linestyle='dashed');

g=line([(20,0), (20, 0.1)], color='black')
z= g + Lg1 + Lg2 + Lg3 + Lg4 + Lg5 + cp3 + cp4 + cp5 + cp6;

edit retag close merge delete

Sort by » oldest newest most voted

I tried to rephrase the essence of your question more concisely at ask-sage question 26637.

I am taking the opportunity here to make a few comments on the code you provided.

• You declared a bunch of variables for nothing, you needed only declare r since it's the only one that you are using as a symbolic variable.

• You can even dispense with declaring variables at all, if you use x in your function definitions (since x is defined when you open Sage).

• You are creating a lot of plots with mostly the same options, so it would be worth making a dictionary out of those, and using that dictionary each time.

This way, if you spot a typo (eg Illuminace > Illuminance), or decide to use SI units (lux > lx), and so on, you only have to make the change in one place, and you don't risk forgetting one of the occurrences.

By the way it looks like this is what happened with your ymin and ymax, which are 1e-4 to 0.3 in some places, and 0 to 0.1 in other places.

• Apparently the line doesn't work well in log scale, that would be worth a question in itself. A workaround is to use a parametric plot.

• You don't need semi-colons all over the place.

• You have some ticks outside the y-range.

Putting all these remarks into use, here is how I would rewrite your code.

f1 =  1.0 / x^2 * exp(-x/50.)
f2 =  2.4 / x^2 * exp(-x/50.)
f3 =  4.0 / x^2 * exp(-x/50.)
f4 =  5.0 / x^2 * exp(-x/50.)
f5 = 15.0 / x^2 * exp(-x/50.)

x_range = (x,13,200)

gen_options = {
'ymin': 1e-4,
'ymax': 3e-1,
'scale': ('loglog', 10),
'axes': False,
'frame': True,
'ticks': ([13, 1e2, 200],
[1e-4, 1e-3, 1e-2, 1e-1]),
'axes_labels': ('Distance between led and camera [m]',
'Illuminance on camera sensor [lx]'),
}

title_options = {
'title': 'L_s (scattering length) = 50 m',
}

def lplot(f, title=False, **options):
loc_options = gen_options.copy()
loc_options.update(options)
if title: loc_options.update(title_options)
return plot(f, x_range, **loc_options)

z = Graphics()
z.set_legend_options(loc=1)

Lg1 = lplot(f1, color='blue',   legend_label='I = 1.0 cd', title=True)
Lg2 = lplot(f2, color='black',  legend_label='I = 2.4 cd')
Lg3 = lplot(f3, color='red',    legend_label='I = 4.0 cd')
Lg4 = lplot(f4, color='green',  legend_label='I = 5.0 cd')
Lg5 = lplot(f5, color='violet', legend_label='I = 15. cd')

cp3 = lplot(2e-1, linestyle='dashed', color='red')
cp4 = lplot(1e-6, linestyle='dashed', color='gray')
cp5 = lplot(5e-4, linestyle='dashed', color='gray')
cp6 = lplot(8e-5, linestyle='dashed', color='gray')

# g = line(((20,0), (20, 0.1)), color='black') # seems broken in log scale

# workaround for line in log scale: use parametric_plot
# (setting aspect_ratio to auto -- it defaults to 1 in parametric_plot)
g = parametric_plot((20,x), (x,0,0.1), color='black',
aspect_ratio='automatic', **gen_options)

z += g + Lg1 + Lg2 + Lg3 + Lg4 + Lg5 + cp3 + cp4 + cp5 + cp6
z

more

Thank you for such a nice code and advices. I would learn with this code.

I solved this problem with the followings. axes=None axes_pad=False

more