Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add generic heatplot method #101

Open
jamesramsden-bh opened this issue Mar 28, 2023 · 0 comments
Open

Add generic heatplot method #101

jamesramsden-bh opened this issue Mar 28, 2023 · 0 comments
Assignees
Labels
type:feature New capability or enhancement

Comments

@jamesramsden-bh
Copy link
Contributor

Implement the ability to generate plots like this below into the Python Toolkit, in a manner that can be inherited from and extended by other Python_TK-interiting toolkits.

download

Features to include:

  • Ability to pass lists of X, Y, Z values
  • Ability to enable contours and contour density
  • Colormap
  • Title
  • Axis labels
  • Enable or disable legend, and set title
  • Apply formats to contour and legend values

The code below was used to generate the plot above:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
import matplotlib.ticker as ticker

def myfmt(x, pos):
    return '{0:.1f}'.format(x)

def pcfmt(x, pos):
    return '{0:.0f}%'.format(x)

# Convert from pandas dataframes to numpy arrays
X0, Y0, Z0, = np.array([]), np.array([]), np.array([])
for i in range(len(X_dat)):
        X0 = np.append(X0, X[i])
        Y0 = np.append(Y0, Y[i])
        Z0 = np.append(Z0, Z[i])

# create x-y points to be used in heatmap
xi = np.linspace(X0.min(), X0.max(), 1000)
yi = np.linspace(Y0.min(), Y0.max(), 1000)

# Interpolate for plotting
zi = griddata((X0, Y0), Z0, (xi[None,:], yi[:,None]), method='cubic')


# Create the contour plot
CS = plt.contourf(xi, yi, zi, 150, cmap="Oranges_r",
                  vmax=zi.max(), vmin=zi.min())

intervals = int(zi.max() - zi.min())
CS2 = plt.contour(xi, yi, zi, intervals, colors='k')
plt.clabel(CS2, inline=1, fontsize=10, colors='k', fmt=ticker.FuncFormatter(pcfmt))
plt.colorbar(CS, label="% hours comfortable", format=ticker.FuncFormatter(myfmt))  
plt.xlabel("Evaporative cooling ratio")
plt.ylabel("Wind porosity ratio")
plt.title("% annual hours with UTCI between 9°C and 32°C")
plt.show()

cc @tg359

@jamesramsden-bh jamesramsden-bh added the type:feature New capability or enhancement label Mar 28, 2023
@jamesramsden-bh jamesramsden-bh self-assigned this Mar 28, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type:feature New capability or enhancement
Projects
None yet
Development

No branches or pull requests

1 participant