question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

plot(x, y, G=value, C=cmap) gives strange behavior for individual points

See original GitHub issue

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.

Working

Not_Working

Issue Analytics

  • State:closed
  • Created 3 years ago
  • Comments:5 (4 by maintainers)

github_iconTop GitHub Comments

1reaction
weiji14commented, Apr 18, 2020

Yes it does get a bit confusing, but glad it helped. The -Z syntax seems to be new in GMT 6.0.0, and it might change in GMT 6.1.0 (see GenericMappingTools/gmt/issues/3131 for context) to make colouring the fill and outline more intuitive.

I’ll leave this issue open for now until we clear up the plot documentation.

0reactions
weiji14commented, Feb 17, 2021

Documentation for plot has been revised significantly in PyGMT v0.3.0 (see https://www.pygmt.org/v0.3.0/api/generated/pygmt.Figure.plot.html) which uses GMT 6.1.1, and long alias zvalue (Z) was added in #666. It might still be a bit confusing getting to know how color (-G) and zvalue (-Z) works, but I’ll close this issue now and we can open up a fresh issue later (if there’s demand) to add a gallery example for using -G/-Z in plot to colour individual points.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Plotting data — Basemap tutorial 0.1 documentation
x and y give the positions of the grid data if the latlon argument is true, the values are supposed to be in...
Read more >
How does parameters 'c' and 'cmap' behave in a matplotlib ...
1. External mapping. You may externally map values to color and supply a list/array of those colors to the scatter 's c ...
Read more >
15-visualising-data
Visual Python — which is a very handy tool to quickly generate animations of time dependent processes taking place in 3d space. Matplotlib...
Read more >
pyplot — Matplotlib 2.0.2 documentation
Provides a MATLAB-like plotting framework. Plot the autocorrelation of x . x is detrended by the detrend callable. Default is no normalization.
Read more >
Plotting - Xarray
Dataset specific plotting routines are also available (see Datasets). ... calls matplotlib.pyplot.plot passing in the index and the array values as x and...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found