Where/When the interpreter generates the graphic output, seaborn vs matplotlib - python-3.x

My question is about using seaborn and matplotlib together, common practice in many works.
I don't understand what command actually generates the graphic output...
How does the Python interpreter know when to plot the graph?
I used to think sns was drawing the graph, since it would be the last command before a graphic output:
plt.title("Monthly Visitors to Avila Adobe")
plt.xlabel("Date")
sns.lineplot(data=museum_data['Avila Adobe'],label='Avila Adobe')
But I found others examples with inverted calls, plt in last, and the graphic output displayed only after the plt call:
sns.lineplot(data=museum_data['Avila Adobe'],label='Avila Adobe')
plt.title("Monthly Visitors to Avila Adobe")
plt.xlabel("Date")
The two codes above do exact the same graphics.
I understand seaborn is build on top of matplotlib.
But,
I don't understand where/when the code generates the graphic output: after the sns or after the plt?
What statement draw the graph?
If my rationalization is wrong, pls clarify why.

Seaborn and Matplotlib are two of Python's most powerful visualization libraries. Seaborn uses fewer syntax and has stunning default themes and Matplotlib is more easily customizable through accessing the classes.
Seaborn
The seaborn package was developed based on the Matplotlib library. It is used to create more attractive and informative statistical graphics. While seaborn is a different package, it can also be used to develop the attractiveness of matplotlib graphics.
To answer your question, When we load seaborn into the session, everytime a matplotlib plot is executed, seaborn's default customizations are added. However, a huge problem that troubles many users is that the titles can overlap. Combine this with matplotlib's only confusing naming convention for its titles it becomes a nuisance. Nevertheless, the attractive visuals still make it usable for every Data Scientist's work.
In order to get the titles in the fashion that we want and have more customizability, We need to use the seaborn & matplotlib structure . Note that this is only necessary if we use subtitles in our plots. Sometimes they are necessary so it is better to have it on hand. Refer below code for more details.
matplotlib style plot :
import matplotlib.pyplot as plt
import numpy as np
# using some dummy data for this example
xs = np.random.randint( 0, 10, size=10)
ys = np.random.randint(-5, 5, size=10)
# plot the points
fig = plt.figure(figsize=(12,6))
fig.suptitle('Matplotlib with Python', fontsize='x-large', fontweight='bold')
plt.subplot(121)
plt.scatter(xs,ys,c='b') # scatter graph plotted from this line
plt.grid()
plt.subplot(122)
plt.plot(xs,ys,'bo--') # line graph plotted from this line
plt.grid()
Seaborn style plot :
import seaborn as sns
sns.set()
fig = plt.figure()
fig.suptitle('Seaborn with Python', fontsize='x-large', fontweight='bold')
fig.subplots_adjust(top=0.87)
#This is used for the main title. 'figure()' is a class that provides all the plotting elements of a diagram.
#This must be used first or else the title will not show.fig.subplots_adjust(top=0.85) solves our overlapping title problem.
fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(121)
fontdict={'fontsize': 14,
'fontweight' : 'book',
'verticalalignment': 'baseline',
'horizontalalignment': 'center'}
ax.set_title('Scatter Plot Tutorial', fontdict=fontdict)
#This specifies which plot to add the customizations. fig.add_sublpot(121) corresponds to top left plot no.1
plt.plot(xs, ys, 'bo' ) # scatter graph plotted from this line in seaborn with matplotlib command & seaborn style
plt.xlabel('x-axis', fontsize=14)
plt.ylabel('yaxis', fontsize=14)
ax = fig.add_subplot(122)
fontdict={'fontsize': 14,
'fontweight' : 'book',
'verticalalignment': 'baseline',
'horizontalalignment': 'center'}
ax.set_title('Line Plot Tutorial', fontdict=fontdict)
sns.lineplot(xs, ys) # line graph plotted from this line in seaborn with seaborn command & seaborn style
plt.xlabel('x-axis', fontsize=14)
plt.ylabel('yaxis', fontsize=14);
Now compare both plots stylewise and please read code comments carefully.
source
Python seaborn tutorial

I posted this question 6 months ago, so, now I'm 6 months more experienced!
How does the Python interpreter know when to plot the graph?
I don't understand where/when the code generates the graphic output: after the sns or after the plt?
What I learn:
Well, I was used to a approach where after a given command and I get a response.
But that is no the case when working with graphics in Python, specially when using a notebook...
Actually, using matplotlib, sns, etc, we can, in a cumulative way, prepare many aspects before actually output the graphic.
And many commands (functions, methods) are capable to do the real display, but it is the last "complete" command (my interpretation here) does the job.
So, since they are consistent, the order is not a problem.
Sure, we need to assure the good logic!
It was that I would like to understand.
The #jay-patel answer helped me to think about it, he give me good examples.

Related

Overlay curves on same plot at each compilation

Since a update I have an issue with my ploting in Matplotlib. I use Spyder (as IDE) from Anaconda and do a lot of overlay stuff by running different programm in other to compare simulation.
But recently this does not work anymore ! For example if I run this code (with and without plt.draw does not change anything, and plt.gca as well) :
import numpy as np
import matplotlib.pyplot as plt
f = np.linspace(1,50,20)
x = f**1
y = f**1.2
fig = plt.figure(0)
ax = fig.add_subplot(1,1,1)
ax.plot(f,x)
ax.plot(f,y)
plt.draw()
And re-run it by change a variable as :
y = f**1.5
The output is not what I used to have and expected
I would expected a update of the axis and a third curves (a green one by default) that appears, but no.
Do you have any idea, I turn crazy to find out with this change et how...
Sorry if it's easy, sometimes the easiest thing to do it's the hardest to see.
Thanks and have nice day

Why the scatter plot is not showing inside pairplot

sns.pairplot(advertising, x_vars=['TV', 'Newspaper', 'Radio'], y_vars='Sales',size=4, aspect=1, kind='scatter')
plt.show()
here when i am calling the pairplot function it is not showing the first plot, if you change the sequence of x_vars then again it wont show the first plot.
But you can see it individually, How can i see all of them in a single pairplot.
This is a bug/feature introduced in seaborn v.0.11.0.
The workaround it to pass diag_kind=None to pairplot

seaborn boxplot: Change color and shape of mean

Simple question that I cannot seem to find the answer to.
How do I change the color and shape of the mean indicator in a Seaborn Boxplot?
It defaults to a Green Triangle and it generally difficult to see.
I've tried to find the answer in both the seaborn documentation, as well as the matplotlib documentation. There is also a related question on stackoverflow where someone asked how to change around colors related to the seaborn boxplots and was able to change everything except for the mean indicator.
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data = [[np.random.rand(100)] for i in range(3)]
sns.boxplot(data=data, showmeans=True)
plt.show()
The keyword argument you are looking for is meanprops. It is in the matplotlib boxplot documentation under "other parameters":
import seaborn as sns
data = [[np.random.rand(100)] for i in range(3)]
sns.boxplot(data=data, showmeans=True,
meanprops={"marker":"s","markerfacecolor":"white", "markeredgecolor":"blue"})
plt.show()

is it possible to edit matplotlib plot interactively?

I am not sure if this is an acceptable question in SE.
I am wondering if it is possible to edit matplotlib plot interactively. i.e.,
# plot
plt.plot(x, y[1])
plt.plot(x, -1.0*y[2])
plt.show()
will open up a tk screen with the plot. Now, say, I want to modify the linewidth or enter x/y label. Is it possible to do that interactively (either on the screen, using mouse like xmgrace or from a gnuplot like command prompt)?
You can do simple interactive editing with pylustrator
pip install pylustrator
One way to do what (I think) you ask for is to use ipython. ipython is an interactive python environment which comes with many python distributions.
A quick example:
In a cmd, type >>> ipython, which will load the ipython terminal. In ipython, type:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
ax.plot([1, 2, 3, 4, 5], [1, 2, 3, 4, 5], 'r-')
fig.show()
Now you have a figure, at the same time as the ipython terminal is "free". This means that you can do commands to the figure, like ax.set_xlabel('XLABEL'), or ax.set_yticks([0, 5]). To make it show on screen, you need to redraw the canvas, which is done by calling fig.canvas.draw().
Note that with ipython, you have full tab-completion with all functions to all objects! Typing fig.get_ and then tab gives you the full list of functions beginning with fig.get_, this is extremely helpful!
Also note that you can run python-scripts in ipython, with run SCRIPT.py in the ipython-cmd, and at the same time having access to all variables defined in the script. They can then be used as above.
Hope this helps!
No, it is not generally possible to do what you want (dynamically interact with a matplotlib using the mouse).
What you see is a rendering of your plot on a "canvas", but it does not include a graphical user interface (GUI) like you have with e.g. xmgrace, Origin etc.
That being said, if you wish to pursue it you have a number of possible options, including:
Modify the matplotlib source code yourself to include a GUI
Do something with buttons, like in YuppieNetworking's answer here:
Change dynamically the contents of a matplotlib plot
But it is probably quicker and more convenient to just use some other plotting software, where someone has already designed a decent user interface for you.
Alternatively, using an iPython notebook to quickly modify your plot script works well enough.
There is a navigation toolbar in qt4agg matplotlib backend which you can add easily. Not much, but at least good scaling...
Not a working code, just some fragments:
from matplotlib.backends.backend_qt4agg import FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
self.figure = Figure(figsize=(5, 3))
self.canvas = FigureCanvas(self.figure)
self.addToolBar(QtCore.Qt.BottomToolBarArea,
NavigationToolbar(self.canvas, self))
Self is your window object derived from QtGui.QMainWindow.

Matplotlib Crash When Figure 1 not Closed Last

I am plotting mutliple figures using Matplotlib using Python 3.4.
When the multiple figures are open and I close the windows closing the first figure last (ie once all other figures are closed) python does not crash.
If, however, I close the first figure that was plotted first and then close the rest Python crashes.
It seems as though you need to close the windows in such an order that the first window that was opened must be closed last. Has anyone else experienced and is there a solution?
Here is a trivial example code that can be used to verify:
import matplotlib.pyplot as plt
plt.figure(1) # the first figure
plt.plot([1,2,3])
plt.figure(2) # a second figure
plt.plot([4,5,6])
plt.show()
As discussed on the IPython bug tracker this is a bug in a TCL/TK library which is shipped with python 3.4 on windows.
Changing the backend to Qt works around the problem by using a different gui framework.
The way I have managed to solve this issue has been to use Qt4 as the matplotlib backend.
Simply add the following two lines of code after importing matplotlib.
import matplotlib as mpl
mpl.rcParams['backend'] = "qt4agg"
mpl.rcParams['backend.qt4'] = "PySide"
This is what I do on Python 3 and have no plot closing errors
I use this to do effectively what should be done by plt.close('all'):
def closeall(): # this closes all figures in reverse order
l = plt.get_fignums()
l.reverse()
for a in l:
plt.close(a)
Whenever you are plotting multiple figures, do not use plt.show, create your figures separately in a figure instance and add an Axes using add_subplot. Here is an example:
import matplotlib.pyplot as plt
fig1 = plt.figure()
ax1 = fig1.add_subplot(211) # the first subplot in the first figure
ax1.plot([1,2,3])
ax2 = fig1.add_subplot(212) # the second subplot in the first figure
ax2.plot([4,5,6])
plt.suptitle('Easy as 1,2,3')
fig1.show()
fig2 = plt.figure()
ax3 = fig2.add_subplot(211) # the first subplot in the second figure
ax3.plot([4,5,6])
ax4 = fig2.add_subplot(212) # the second subplot in the second figure
ax4.plot([4,5,6])
plt.suptitle('Easy as 1,2,3')
fig2.show()
By doing so you can still use your python shell even when the plots are active. This is the best way to plot multiple plots.

Resources