Python Forum

Full Version: How to increase the size of a png picture for the heatmap of the correlation?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Good evening to the community Smile
I am working with the file "Santé3".
I would like to create and download a png picture with a good definition for my heatmap of correlation where we can see the entire heatmap of the correlation.
I tried some codes but I have still words which are not showed.
from pandas import read_csv
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import numpy.ma as ma
import pandas as pd

dataset = pd.read_csv('Santé3.csv', sep= ';', encoding='latin-1', index_col=0)
dataset.drop(['Dynaverage'], axis=1, inplace=True)
corr = dataset.corr()
plt.figure(figsize=(200,30))
plt.subplots(figsize=(15,8))
sns.heatmap(corr, cmap='coolwarm', vmin=-1, vmax=1, annot=True, mask=mask)
plt.savefig("correlation.png")
Thank you for your answer.
Have you tried setting dpi in the savefig call or saving to a svg file?
Dear deanhystad,
I think dpi is related to the quality of the image, not the size.

from pandas import read_csv
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import numpy.ma as ma
import pandas as pd
 
dataset = pd.read_csv('Santé3.csv', sep= ';', encoding='latin-1', index_col=0)
dataset.drop(['Dynaverage'], axis=1, inplace=True)
corr = dataset.corr()
plt.figure(figsize=(200,30))
plt.subplots(figsize=(15,8))
sns.heatmap(corr, cmap='coolwarm', vmin=-1, vmax=1, annot=True, mask=mask)
plt.savefig("correlation.png", dpi=400)
Did you try it? If I capture a 3x3 plot at 100dpy the image is 300x300 pixels. At the 1000dpi the same image is 3000x3000 pixels
Dear deanhystad,
it's not working with svg file.

from pandas import read_csv
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import numpy.ma as ma
import pandas as pd
 
dataset = pd.read_csv('Santé3.csv', sep= ';', encoding='latin-1', index_col=0)
dataset.drop(['Dynaverage'], axis=1, inplace=True)
corr = dataset.corr()
plt.figure(figsize=(200,30))
plt.subplots(figsize=(15,8))
sns.heatmap(corr, cmap='coolwarm', vmin=-1, vmax=1, annot=True, mask=mask)
plt.savefig("correlation.svg", dpi=400)
(Oct-05-2021, 07:06 PM)deanhystad Wrote: [ -> ]Did you try it? If I capture a 3x3 plot at 100dpy the image is 300x300 pixels. At the 1000dpi the same image is 3000x3000 pixels

With a DPI of 1000, you can see that it doesn't change. I can't see the labels.

from pandas import read_csv
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import numpy.ma as ma
import pandas as pd
 
dataset = pd.read_csv('Santé3.csv', sep= ';', encoding='latin-1', index_col=0)
dataset.drop(['Dynaverage'], axis=1, inplace=True)
corr = dataset.corr()
plt.figure(figsize=(200,30))
plt.subplots(figsize=(15,8))
sns.heatmap(corr, cmap='coolwarm', vmin=-1, vmax=1, annot=True, mask=mask)
plt.savefig("correlation.png", dpi=1000)
It works as I mentioned. When capturing a pyplot plot (I don't have seaborn) my 100dpi plot was 300x300 pixels and the 1000dpi plot was 3000x3000 pixels when opened in Paint. This must be a seaborn thing.

I found this when looking for resizing a heatmap. Looks like the kitchen sink approach.

https://stackoverflow.com/questions/4333...ng-seaborn
plt.figure(figsize=(6, 6),  dpi = 600)   #  I would go higher than this
sns.heatmap(corr, cmap="Blues", annot=True, annot_kws={"size": 8})  #Make labels and annotation bigger too
plt.tick_params(axis = 'x', labelsize = 12) # x font label size
plt.tick_params(axis = 'y', labelsize = 12) # y font label size
Thank you so much deanhystad. I can see the labels with a good definition with this code.

from pandas import read_csv
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma
import pandas as pd

 
dataset = pd.read_csv('Santé3.csv', sep= ';', encoding='latin-1', index_col=0)
dataset.drop(['Dynaverage'], axis=1, inplace=True)
corr = dataset.corr()
plt.figure(figsize=(6,6), dpi=1000)
plt.subplots(figsize=(15,8))
sns.heatmap(corr, cmap='coolwarm', vmin=-1, vmax=1, annot=True, mask=mask, annot_kws={"size":8})
plt.tick_params(axis = 'y', labelsize = 5)
plt.tick_params(axis = 'x', labelsize = 5)
plt.savefig("correlation.png", dpi=2000)
I bet it is the dpi setting in plt.figure(). You have to set the dpi before making the heatmap so seaborn can use the higher dpi setting.

Why are you calling plt.figure and plt.subplots? When I run your code it shows two plot windows; an empty 6x6 window and a 15x8 window that contains a plot (mine is a line plot). You can remove either and you will still get a png image file.

From what you've said in earlier posts I don't think the dpi setting in plt.savefig() is doing anything. Seaborne must be drawing a raster image, and changing the dpi is not going to increase the resolution of the png file. Setting the dpi in plt.savefig worked for me because the plot I was saving was vector graphics, and vector graphics rescale very well.
A few questions.

In post #5 you say "it's not working with svg file." Does the program crash? Doesn't it generate the file? Can't you use the file? How is it "not working"?

In post #6 you post an image and say "I can't see the labels". Which labels? When I look at the attached image I can see axis labels and annotations. And the labels and annotations look good. Where are there supposed to be labels that I cannot see?