# How to plot a function with multiple parameters on the same set of axes

• Python

## Summary:

I'm currently trying to plot a graph wich describes a photoionization cross section as a function of incident photon energy for optical transition in a semiconductor for different values of the γ factor. But the the outcome is pretty different of what it should be, as one can see in the attachments

## Main Question or Discussion Point

I attached a file with some explanations of the variables in the code and the plot that I should get. I don't know what is wrong. Any help will appreciated.
Python:
from scipy.integrate import quad
import numpy as np
from scipy.special import gamma as gamma_function
from scipy.constants import  e
import matplotlib.pyplot as plt

#Constants
epsilon = 13.1          # dielectric constant of the material
gamma_C = 0.5           # donor impurity linewidth
nr = 3.2                # refractive index of semiconductor
flux = 0.0              # Phi in eqn 8 magnetic flux
R = 5.0                 # radius of the quantum ring in nm
hbar = 1.0        # reduced Planck constant in eV
h = 2*np.pi*hbar          # Planck constant in eV
c = 1.0
alpha = e**2/hbar*c
R = 5  # nm
r = np.linspace(0, 6 * R,100)
nu = np.linspace(0,100, 100)
# Function that calculates the integrand
def func(rho):
betai = gamma**2 / 2.0
betaf = np.sqrt(1.0 + gamma**4 / 4.0)
return (gamma * rho)**(betai + betaf) * np.exp(-0.5 * (gamma * rho)**2) * rho**2

def compute_matrix_element(gamma):
betai = gamma**2 / 2.0
betaf = np.sqrt(1.0 + gamma**4 / 4.0)
integral = quad(func, 0, np.infty)[0]
first_sqrt  = (1.0 / (2.0**betai * gamma_function(betai + 1)))**0.5
second_sqrt = (1.0 / (2.0**betaf * gamma_function(betaf + 1)))**0.5
return gamma**2 / 2.0 / np.pi * R * first_sqrt * second_sqrt * integral

def compute_cross_section(hnu, gamma):
# function that calculates the photoionisation cross section
betai = gamma**2 / 2.0
betaf = np.sqrt(1.0 + gamma**4 / 2.0)
Ei = gamma**2 * (1.0 + betai) - gamma**4 / 2.0
Ef = gamma**2 * (1.0 + betaf) - gamma**4 / 2.0
delta = hbar / np.pi * gamma_C / ( nu - (Ef - Ei )**2 + (hbar * gamma_C)**2)
matrix_element = compute_matrix_element(gamma)
return nr / epsilon * 4.0 * np.pi / 3.0 * alpha * h*nu * (abs(matrix_element))**2 * delta

#Plot
plt.figure()
for gamma in [1.0, 1.5, 2.0]:
plt.plot(h*nu, (compute_cross_section(h*nu, gamma)))

plt.legend(['$\gamma = 1.0$', '$\gamma = 1.5$', '$\gamma = 2.0$'] )
plt.ylabel('$\\times$-section $\sigma$ (cm$^{2}$)')
plt.xlabel('Photon energy $h\\nu$ (meV)')
plt.xlim(0,100)
plt.show()

#### Attachments

• 104.8 KB Views: 14
• 33.1 KB Views: 14
Last edited by a moderator:

## Answers and Replies

Related Programming and Computer Science News on Phys.org
jedishrfu
Mentor
Here's an example:

https://www.w3resource.com/graphics/matplotlib/basic/matplotlib-basic-exercise-5.php

It looks like the label setting defines a new plot line within plot so try adding a label option using the gamma value of the loop.

Python:
plt.figure()
for gamma in [1.0, 1.5, 2.0]:
plt.plot(h*nu, (compute_cross_section(h*nu, gamma)), label="Gamma: "+str(gamma))
or alternatively:

Python:
plt.figure()
for gamma in [1.0, 1.5, 2.0]:
plt.plot(h*nu, (compute_cross_section(h*nu, gamma)), label="Gamma: %3.1f"%gamma)

Not quite sure if I understood what you're saying. Should I change the label to put the gama variable on it?

jedishrfu
Mentor
Did you try it?

Yes, the label must be different between plots. I guess you could say its a key, a means to label the plot data as different from other plot dat being plotted. It also likely is used in making the legends box for the chart.

I tried but nothing has changed. Could it be something else?

phinds
Gold Member
2019 Award
I tried but nothing has changed. Could it be something else?
Uh ... ya think ?

Tom.G