text: from mpl_toolkits.mplot3d.axes3d import Axes3D
  import matplotlib.pyplot as plt
  import numpy as np
  import pandas as pd
  
  
  df = pd.read_csv('transcount.csv')
  df = df.groupby('year').aggregate(np.mean)
  
  gpu = pd.read_csv('gpu_transcount.csv')
  gpu = gpu.groupby('year').aggregate(np.mean)
  
  df = pd.merge(df, gpu, how='outer', left_index=True, right_index=True)
  df = df.replace(np.nan, 0)
  
  fig = plt.figure()
  ax = Axes3D(fig)
  X = df.index.values
  Y = np.log(df['trans_count'].values)
  X, Y = np.meshgrid(X, Y)
  Z = np.log(df['gpu_trans_count'].values)
  ax.plot_surface(X, Y, Z)
  ax.set_xlabel('Year')
  ax.set_ylabel('Log CPU transistor counts')
  ax.set_zlabel('Log GPU transistor counts')
  ax.set_title("Moore's Law & Transistor Counts")
  plt.show()
  