%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pylab as plt
from matplotlib import cm
import numpy as np
from IPython.display import Image
from IPython.core.display import HTML
Image(url= "https://upload.wikimedia.org/wikipedia/commons/f/fc/PVT_3D_diagram.png",
width=400)
R = 0.08314 # L bar/gmol/K
Vm,T = plt.meshgrid(plt.linspace(0.1,3),plt.linspace(200,450))
P = R*T/Vm
P[P>3] = 3
fig = plt.figure(figsize = (20,16))
ax = fig.gca(projection='3d')
ax.plot_surface(Vm,T,P,
rstride=1,cstride=1,antialiased=False,
linewidth=0.2,
alpha = 0.2,
cmap = cm.coolwarm)
cset = ax.contour(Vm,T,P, zdir='x', offset=-10, cmap=cm.coolwarm)
cset = ax.contour(Vm,T,P, zdir='y', offset=600, cmap=cm.coolwarm)
ax.set_xlim(-10,30)
ax.set_ylim(0,600)
ax.set_zlim(0,3)
ax.set_xlabel('Molar Volume [liter/gmol]')
ax.set_ylabel('Temperature [K]')
ax.set_zlabel('Pressure [bar]')
<matplotlib.text.Text at 0x1477e2850>
Vm,T = plt.meshgrid(plt.linspace(0.01,1.5,100),plt.linspace(320,550,100))
# Establish 3D axis
fig = plt.figure(figsize = (20,16))
ax = fig.gca(projection='3d')
# Plot Ideal Gas
P = R*T/Vm
P[P>85] = np.nan
P[P<0] = np.nan
ax.plot_surface(Vm,T,P,
rstride=2,cstride=2,antialiased=False,
linewidth=0.2,
alpha = 0.2,
cmap = cm.coolwarm)
Tc = 369.522 # kelvin
Pc = 42.4924 # bar
Vc = 0.0045*44.097 # liters/gmol
a = 27.0*R**2*Tc**2/(64.0*Pc)
b = R*Tc/(8.0*Pc)
P = R*T/(Vm-b) - a/Vm**2
P[P>85] = 85
P[P<0] = np.nan
ax.scatter(Vc,Tc,Pc,s=50)
ax.scatter(Vc,600.,Pc,s=50)
ax.scatter(-0.5,Tc,Pc,s=50)
ax.plot_surface(Vm,T,P,
rstride=1,cstride=1,antialiased=False,
linewidth=0.2,
alpha = 0.4,
cmap = cm.coolwarm)
cset = ax.contour(Vm,T,P, zdir='x', offset=-0.5, cmap=cm.coolwarm)
cset = ax.contour(Vm,T,P, zdir='y', offset=600, cmap=cm.coolwarm)
ax.set_xlim(-0.5,1.5)
ax.set_ylim(320,600)
ax.set_zlim(0,85)
ax.set_xlabel('Molar Volume [liter/gmol]')
ax.set_ylabel('Temperature [K]')
ax.set_zlabel('Pressure [bar]')
/Users/jeff/anaconda/lib/python2.7/site-packages/ipykernel/__main__.py:12: RuntimeWarning: invalid value encountered in less
<matplotlib.text.Text at 0x1688a67d0>