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

Click For Summary
SUMMARY

This discussion focuses on plotting a function with multiple parameters using Python's Matplotlib library. The user is attempting to visualize the photoionization cross section calculated from a quantum mechanics model, but is encountering issues with the plot labels. The recommended solution involves modifying the label parameter in the plot function to include the gamma variable, ensuring each plot line is distinctly labeled for clarity. The provided code snippets illustrate how to implement these changes effectively.

PREREQUISITES
  • Familiarity with Python programming
  • Understanding of Matplotlib for data visualization
  • Basic knowledge of quantum mechanics concepts
  • Experience with numerical integration using SciPy
NEXT STEPS
  • Explore advanced Matplotlib features for customizing plots
  • Learn about SciPy's quad function for numerical integration
  • Investigate quantum mechanics principles related to photoionization
  • Study the use of legends and labels in Matplotlib for better data representation
USEFUL FOR

Data scientists, physicists, and software developers interested in visualizing complex mathematical functions and enhancing their data presentation skills using Python.

Daniel Lima
Messages
3
Reaction score
2
TL;DR
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
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

Last edited by a moderator:
Technology news on Phys.org
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?
 
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?
 
Daniel Lima said:
I tried but nothing has changed. Could it be something else?
Uh ... you think ?
 
Daniel Lima said:
I tried but nothing has changed. Could it be something else?
Just remember, Sir:
“When you have exhausted all possibilities, remember this - you haven't.”[/size]

― Thomas Edison
 
  • Like
Likes phinds

Similar threads

  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
Replies
0
Views
2K
  • · Replies 41 ·
2
Replies
41
Views
6K
  • · Replies 6 ·
Replies
6
Views
4K
  • · Replies 2 ·
Replies
2
Views
17K
Replies
7
Views
2K
Replies
1
Views
624