-
Notifications
You must be signed in to change notification settings - Fork 234
Description
Description of the problem
In plot(), using G=value and C=cmap to interpret a color from a CMAP for a single value doesn't work in the same way that a list/array of values does. Interpreting a single value from a color map would be useful for plotting a bunch polygons with different colors (ex: for coulomb stress changes on fault segments).
- For plotting arrays of points, G returns an array of colors extracted from the cmap, as it should
- For plotting single polygons, G returns foreground or background color. wrong?
- For plotting single points, G returns 0. wrong?
In the single-element case, plot() requires G=str, which is also counter-intuitive.
Either way, the result makes it difficult to plot custom-colored polygons with a colormap
(usually I would just extract a color for each polygon and plot each one separately, calling plot() in a loop). Is there another way to plot polygons with cmap colors?
In the example code, I'm plotting some dummy data, once as an array of points, and once in a for-loop with points and polygons in individual plot() calls. The cmap behavior is quite different.
Full code that generated the error
import pygmt
# Make CPT and Fake Data
pygmt.makecpt(C="jet",T="-1.0/1.0/0.05",H="mycpt.cpt");
xdata = [-123, -122.5, -122.0, -121.5];
ydata = [36.5, 37, 37.5, 38];
zdata = [-0.7, -0.25, 0.25, 0.7];
# Batch Calling : works
fig = pygmt.Figure()
title="+t\"Batch to CMAP - Works for Points.\"";
fig.coast(region=[-124, -120, 35, 39], projection="M7i", B=[title,"1.0"],shorelines="1.0p,black");
fig.colorbar(D="jBr+w3.5i/0.2i+o5.5c/1.5c+h",C="mycpt.cpt",I="0.8",G="-1.0/1.0",B=["x"+str(0.2),"y+L\"KPa\""]);
fig.plot(x=xdata, y=ydata, color=zdata, style="c1.8c", pen="thick,black", C="mycpt.cpt");
fig.savefig("Working.png");
# Single Calls Only : doesn't do the right thing
fig = pygmt.Figure()
title="+t\"Single Calls to CMAP - Odd.\"";
fig.coast(region=[-124, -120, 35, 39],projection="M7i",shorelines="1.0p,black",B=[title,"1.0"]);
fig.colorbar(D="jBr+w3.5i/0.2i+o5.5c/1.5c+h",C="mycpt.cpt",I="0.8",G="-1.0/1.0",B=["x"+str(0.2),"y+L\"KPa\""]);
for i in range(len(xdata)): # just looping through the data
fig.plot(x=xdata[i], y=ydata[i], G=str(zdata[i]), style="c1.8c", pen="thick,black", C="mycpt.cpt"); # plotting a point with associated cmap data
xdata_long = [xdata[i]+0.2, xdata[i]+0.3, xdata[i]+0.3, xdata[i]+0.2, xdata[i]+0.2]; # building a polygon
ydata_long = [ydata[i], ydata[i], ydata[i]+0.1, ydata[i]+0.1, ydata[i]]; # building a polygon
fig.plot(x=xdata_long, y=ydata_long, G=str(zdata[i]), pen="thick,black", C="mycpt.cpt"); # plotting the polygon with associated cmap data
fig.savefig("Not_Working.png");System information
Mac OSX Mojave, miniconda3 package manager, python3.6. I installed pygmt in a brand new python environment today.

