Repository: Qiskit/qiskit

Issue:
making the plot_city look nicer
<!-- ⚠️ If you do not respect this template, your issue will be closed -->
<!-- ⚠️ Make sure to browse the opened and closed issues to confirm this idea does not exist. -->

### What is the expected enhancement?

- [ ] make rho the latex version
- [ ] use standard version of imag and real 
- [ ] set the size of real/imag to be the same for both plots (0.25, 0.5, 0.75, 1) depending on the largest element
- [ ] add the z axis to the bottom left 


<img width="804" alt="image" src="https://user-images.githubusercontent.com/15731369/57204539-72924480-6f86-11e9-8d37-8b4202a6d764.png">




Discussion:
Could I get some more clarification on what the standard version of imag/real is?

Resolving patch:
diff --git a/qiskit/visualization/state_visualization.py b/qiskit/visualization/state_visualization.py
--- a/qiskit/visualization/state_visualization.py
+++ b/qiskit/visualization/state_visualization.py
@@ -28,7 +28,6 @@
 
 if HAS_MATPLOTLIB:
     from matplotlib import get_backend
-    from matplotlib.ticker import MaxNLocator
     from matplotlib import pyplot as plt
     from matplotlib.patches import FancyArrowPatch
     from matplotlib.patches import Circle
@@ -330,6 +329,10 @@ def plot_state_city(rho, title="", figsize=None, color=None,
     y = [0, 0, max(ypos)+0.5, max(ypos)+0.5]
     z = [0, 0, 0, 0]
     verts = [list(zip(x, y, z))]
+    max_dzr = max(dzr)
+    min_dzr = min(dzr)
+    min_dzi = np.min(dzi)
+    max_dzi = np.max(dzi)
 
     if ax1 is not None:
         fc1 = generate_facecolors(xpos, ypos, zpos, dx, dy, dzr, color[0])
@@ -348,6 +351,21 @@ def plot_state_city(rho, title="", figsize=None, color=None,
 
         if min(dzr) < 0 < max(dzr):
             ax1.add_collection3d(pc1)
+        ax1.set_xticks(np.arange(0.5, lx+0.5, 1))
+        ax1.set_yticks(np.arange(0.5, ly+0.5, 1))
+        if max_dzr != min_dzr:
+            ax1.axes.set_zlim3d(np.min(dzr), max(np.max(dzr) + 1e-9, max_dzi))
+        else:
+            if min_dzr == 0:
+                ax1.axes.set_zlim3d(np.min(dzr), max(np.max(dzr)+1e-9, np.max(dzi)))
+            else:
+                ax1.axes.set_zlim3d(auto=True)
+        ax1.get_autoscalez_on()
+        ax1.w_xaxis.set_ticklabels(row_names, fontsize=14, rotation=45)
+        ax1.w_yaxis.set_ticklabels(column_names, fontsize=14, rotation=-22.5)
+        ax1.set_zlabel('Re[$\\rho$]', fontsize=14)
+        for tick in ax1.zaxis.get_major_ticks():
+            tick.label.set_fontsize(14)
 
     if ax2 is not None:
         fc2 = generate_facecolors(xpos, ypos, zpos, dx, dy, dzi, color[1])
@@ -363,48 +381,29 @@ def plot_state_city(rho, title="", figsize=None, color=None,
 
         pc2 = Poly3DCollection(verts, alpha=0.2, facecolor='k',
                                linewidths=1, zorder=1)
+
         if min(dzi) < 0 < max(dzi):
             ax2.add_collection3d(pc2)
-    if ax1 is not None:
-        ax1.set_xticks(np.arange(0.5, lx+0.5, 1))
-        ax1.set_yticks(np.arange(0.5, ly+0.5, 1))
-        max_dzr = max(dzr)
-        min_dzr = min(dzr)
-        if max_dzr != min_dzr:
-            ax1.axes.set_zlim3d(np.min(dzr), np.max(dzr)+1e-9)
-        else:
-            if min_dzr == 0:
-                ax1.axes.set_zlim3d(np.min(dzr), np.max(dzr)+1e-9)
-            else:
-                ax1.axes.set_zlim3d(auto=True)
-        ax1.zaxis.set_major_locator(MaxNLocator(5))
-        ax1.w_xaxis.set_ticklabels(row_names, fontsize=14, rotation=45)
-        ax1.w_yaxis.set_ticklabels(column_names, fontsize=14, rotation=-22.5)
-        ax1.set_zlabel("Real[rho]", fontsize=14)
-        for tick in ax1.zaxis.get_major_ticks():
-            tick.label.set_fontsize(14)
-    if ax2 is not None:
+
         ax2.set_xticks(np.arange(0.5, lx+0.5, 1))
         ax2.set_yticks(np.arange(0.5, ly+0.5, 1))
-        min_dzi = np.min(dzi)
-        max_dzi = np.max(dzi)
         if min_dzi != max_dzi:
             eps = 0
-            ax2.zaxis.set_major_locator(MaxNLocator(5))
-            ax2.axes.set_zlim3d(np.min(dzi), np.max(dzi)+eps)
+            ax2.axes.set_zlim3d(np.min(dzi), max(np.max(dzr)+1e-9, np.max(dzi)+eps))
         else:
-            ax2.axes.set_zlim3d(auto=True)
             if min_dzi == 0:
                 ax2.set_zticks([0])
                 eps = 1e-9
-                ax2.axes.set_zlim3d(np.min(dzi), np.max(dzi)+eps)
+                ax2.axes.set_zlim3d(np.min(dzi), max(np.max(dzr)+1e-9, np.max(dzi)+eps))
             else:
                 ax2.axes.set_zlim3d(auto=True)
         ax2.w_xaxis.set_ticklabels(row_names, fontsize=14, rotation=45)
         ax2.w_yaxis.set_ticklabels(column_names, fontsize=14, rotation=-22.5)
-        ax2.set_zlabel("Imag[rho]", fontsize=14)
+        ax2.set_zlabel('Im[$\\rho$]', fontsize=14)
         for tick in ax2.zaxis.get_major_ticks():
             tick.label.set_fontsize(14)
+        ax2.get_autoscalez_on()
+
     fig.suptitle(title, fontsize=16)
     if ax_real is None and ax_imag is None:
         if get_backend() in ['module://ipykernel.pylab.backend_inline',


Test patch: