I am trying to create a Control Variability Grid Analysis in Python. This analysis requires plotting min and max blood glucose values (in this case, my own) per day on a scatterplot, with a background image that helps classify the overall glucose control. See here.
I have found other threads that address this question, but I cannot seem to get it to work for my application. I need the axes to be a specific range, and I think that is interfering with the image. The code I have tried so far, based on this page and this page, is as follows:
img = plt.imread('CVGA.png')
fig, ax = plt.subplots(figsize = (12,6))
sns.scatterplot(data=min_max_day,x=min_max_day['Glucose Value (mg/dL)']['amin'],
y=min_max_day['Glucose Value (mg/dL)']['amax'], zorder=1)
plt.xlim(110,40)
plt.ylim(110,400)
ax.imshow(img);
And the output looks like this:

With the line “ax.imshow(img)” removed, the output looks like this:

Additional details:
- the image I’m using is 1200×1200:

- Maybe there is a problem with the fact that the scale I’m using isn’t a perfect square? Not sure if that makes sense, but clearly 110 to 400 on the Y axis and 100 to 40 on the X axis would not make a perfect square? I am unsure what to do about that.
Any advice or help would be greatly appreciated. Thanks a lot.
Advertisement
Answer
- Use the
extentparameter as shown in Change values on matplotlib imshow() graph axis, but you must also useaspect='auto'and setfigsize = (12, 12)(or(6, 6), etc.).- See all parameters at
matplotlib.pyplot.imshow
- See all parameters at
sns.scatterplotfrom the OP is commented out because no data was provided.- Tested in
python 3.8,matplotlib 3.4.2, andseaborn 0.11.1
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np # sample data
img = plt.imread('CVGA.png')
fig, ax = plt.subplots(figsize=(6, 6))
# sns.scatterplot(data=min_max_day, x=min_max_day['Glucose Value (mg/dL)']['amin'], y=min_max_day['Glucose Value (mg/dL)']['amax'], zorder=1)
sns.scatterplot(x=np.linspace(110, 41, 10), y=np.linspace(110, 401, 10), ax=ax)
plt.xlim(110, 40)
plt.ylim(110, 400)
ax.imshow(img, extent=[110, 40, 110, 400], aspect='auto')
