Show scatter plot title from column value

Viewed 865

I'm making automatic scatterplot charting with regression from my dataframe example

enter image description here

I want to make correlation between Column2 to Column3 and Column2 to Column4 in separate scatter plot group by Column1. For example, there will be 3 scatter plot of Column2 to Column3 each with the title of A, B, and C

For the plotting I'm using pandas scatter plot for example:

df.groupby('Column1').plot.scatter(x='Column2',y='Column3')

Scatter plot return exactly 3 plot, but I want to know how to add chart title based on grouping from Column1 and also how to add the regression line. I haven't use seaborn or matplotlib yet because it's quite confusing for me, so I appreciate if you can explain more :))

EDIT 1

Sorry for not being clear before. My code previously running fine but with output like this.

enter image description here

It's ok but hard to look at which plot belong to which group. Hence my intention is to create something like this

enter image description here

EDIT 2

Shoutout to everyone who are kindly helping. Caina especially helped me a lot, shoutout to him also.

This is the code he write based on several addition on the comment.

fig, axes = plt.subplots(1, df.Column1.nunique(), figsize=(12,8))

groups = df.groupby('Column1')
fig.tight_layout(pad=3)

# If `fig.tight_layout(pad=3)` does not work:
# plt.subplots_adjust(wspace=0.5) 

for i, (gname, gdata) in enumerate(groups):
    sns.regplot(x='Column2', y='Column3', data=gdata, ax=axes[i])
    axes[i].set_title(gname)
    axes[i].set_ylim(0,)

And this is my result plot enter image description here

The title and the axis works beautifully. This thread can be considered closed as I got the help for the plot.

But as you can see, the bottom plot is in weird presentation as it also display the x axis from 0 to 600 and y from 0 to 25 although all of them should have same y axis format. For the other chart they are also stretched horizontally.

I'm trying to use the method here but not really successful with parameter square or equal

Can I ask for further on how to adjust the axis so the plot will be a square?Thank you!

3 Answers

You can iterate over your groups, specifying the title:

fig, axes = plt.subplots(1, df.Column1.nunique(), figsize=(12,8))

groups = df.groupby('Column1')

for i, (gname, gdata) in enumerate(groups):
    sns.regplot(x='Column2', y='Column3', data=gdata, ax=axes[i]).set_title(gname)

You can also use seaborn.FacetGrid directly:

g = sns.FacetGrid(df, col='Column1')
g.map(sns.regplot, 'Column2', 'Column2')

Edit (further customization based on new requirements in comments):

fig, axes = plt.subplots(1, df.Column1.nunique(), figsize=(12,8))

groups = df.groupby('Column1')
fig.tight_layout(pad=3)

# If `fig.tight_layout(pad=3)` does not work:
# plt.subplots_adjust(wspace=0.5) 

for i, (gname, gdata) in enumerate(groups):
    sns.regplot(x='Column2', y='Column3', data=gdata, ax=axes[i])
    axes[i].set_title(gname)
    axes[i].set_ylim(0,)

You can also use the seaborn in-built functionality. If you want to see the correlation you can just do df.corr().

import seaborn as sns
sns.heatmap(df.corr(),annot=True) # This is HeatMap

HeatMap

You can also use pairplot.

sns.set_style('whitegrid')
sns.set(rc={'figure.figsize':(13.7,10.27)})
sns.set(font_scale=1.3)
sns.set_palette("cubehelix",8)
sns.pairplot(df)

PairPlot

Here's what I did. You can try something like this.

fig, axes = plt.subplots(ncols=3,figsize=(12,6))
plt.subplots_adjust(wspace=0.5, hspace=0.3)
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[0])
axes[0].set_title("A")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[1])
axes[1].set_title("B")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[2])
axes[2].set_title("C")
plt.show()

The output of this is:

enter image description here

If you want to see the answers vertically, then change ncols to nrows and fix the figsize.

fig, axes = plt.subplots(nrows=3,figsize=(3,12))
plt.subplots_adjust(wspace=0.2, hspace=.5)
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[0])
axes[0].set_title("A")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[1])
axes[1].set_title("B")
df.groupby('Column1').plot.scatter(x='Column2',y='Column3',color="DarkBlue",ax=axes[2])
axes[2].set_title("C")
plt.show()

This will give you:

enter image description here

Related