matplotlib / basemap

Plot on map projections (with coastlines and political boundaries) using matplotlib
MIT License
780 stars 392 forks source link

Hollow markers are not transparent #455

Open jsh9 opened 5 years ago

jsh9 commented 5 years ago

Hello,

When I tried to plot hollow markers on the map, the marker is actually filled, not transparent. See this map below:

image

Below is the code to reproduce this map:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

lon_ll = -124.5  # lower left corner, longitude
lon_ur = -105.2  # upper right corner, longitude
lat_ll = 32.0    # lower left corner, latitude
lat_ur = 42.0    # upper right corner, latitude

f = plt.figure(dpi=100)
ax = plt.axes()

m = Basemap(llcrnrlon=lon_ll,llcrnrlat=lat_ll,
            urcrnrlon=lon_ur,urcrnrlat=lat_ur,\
            rsphere=(6378137.00,6356752.3142),\
            resolution='c',projection='merc',\
            lat_0=(lat_ll+lat_ur)/2,\
            lon_0=(lon_ll+lon_ur)/2,lat_ts=20.,
            epsg = 3310)

m.arcgisimage(service='World_Physical_Map', xpixels=120, epsg=3310, verbose=False)

m.drawstates()

LA = (34.05, -118.25)
LV = (36.175, -115.136389)
SF = (37.783333, -122.416667)
PH = (33.45, -112.066667)

ms = 15
alpha = 0.75

m.plot(*m(LV[1], LV[0]), marker='s', ms=ms,
       ls='none', mew=1.25,c='blue', fillstyle='none', alpha=alpha)
m.plot(*m(LA[1], LA[0]), marker='o', ms=ms,
       ls='none', mew=1.25,c='red', fillstyle='right', alpha=alpha)
m.plot(*m(PH[1], PH[0]), marker='o', ms=ms,
       ls='none', mew=1.25,c='green', fillstyle='full', alpha=alpha)
m.plot(*m(SF[1], SF[0]), marker='o', ms=ms,
       ls='none', mew=1.25,c='cyan', fillstyle='left', alpha=alpha,
       markerfacecoloralt='white')

horiz_offset = 0.6  # unit: degrees
plt.text(*m(LA[1] + horiz_offset, LA[0]), 'Los Angeles')
plt.text(*m(LV[1] + horiz_offset, LV[0]), 'Las Vegas')
plt.text(*m(SF[1] + horiz_offset, SF[0]), 'San Francisco')
plt.text(*m(PH[1] + horiz_offset, PH[0]), 'Phoenix')

The markers for Los Angeles and Las Vegas should have been hollow (on the left side for LA, and fully for LV), but they are not. For half-full markers, such as the marker for San Francisco, I can set the markerfacecoloralt to other colors, but not for fully open markers.

Note that I used to not have this issue some time ago, with older versions of matplotlib (I don't remember which).

WeatherGod commented 5 years ago

most likely, this is an issue with matplotlib rather than basemap itself. I also suspect that this has something to do with the style change work for matplotlib v2.0.

On Tue, Mar 19, 2019 at 6:25 PM Jian Shi notifications@github.com wrote:

Hello,

When I tried to plot hollow markers on the map, the marker is actually filled, not transparent. See this map below:

[image: image] https://user-images.githubusercontent.com/25124332/54645888-a3f89480-4a5a-11e9-8345-dec0ccb351c1.png

Below is the code to reproduce this map:

import matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemap

lon_ll = -124.5 # lower left corner, longitude lon_ur = -105.2 # upper right corner, longitude lat_ll = 32.0 # lower left corner, latitude lat_ur = 42.0 # upper right corner, latitude

f = plt.figure(dpi=100) ax = plt.axes()

m = Basemap(llcrnrlon=lon_ll,llcrnrlat=lat_ll, urcrnrlon=lon_ur,urcrnrlat=lat_ur,\ rsphere=(6378137.00,6356752.3142),\ resolution='c',projection='merc',\ lat_0=(lat_ll+lat_ur)/2,\ lon_0=(lon_ll+lon_ur)/2,lat_ts=20., epsg = 3310)

m.arcgisimage(service='World_Physical_Map', xpixels=120, epsg=3310, verbose=False)

m.drawstates() LA = (34.05, -118.25)LV = (36.175, -115.136389)SF = (37.783333, -122.416667)PH = (33.45, -112.066667)

ms = 15 alpha = 0.75

m.plot(m(LV[1], LV[0]), marker='s', ms=ms, ls='none', mew=1.25,c='blue', fillstyle='none', alpha=alpha) m.plot(m(LA[1], LA[0]), marker='o', ms=ms, ls='none', mew=1.25,c='red', fillstyle='right', alpha=alpha) m.plot(m(PH[1], PH[0]), marker='o', ms=ms, ls='none', mew=1.25,c='green', fillstyle='full', alpha=alpha) m.plot(m(SF[1], SF[0]), marker='o', ms=ms, ls='none', mew=1.25,c='cyan', fillstyle='left', alpha=alpha, markerfacecoloralt='white')

horiz_offset = 0.6 # unit: degrees plt.text(m(LA[1] + horiz_offset, LA[0]), 'Los Angeles') plt.text(m(LV[1] + horiz_offset, LV[0]), 'Las Vegas') plt.text(m(SF[1] + horiz_offset, SF[0]), 'San Francisco') plt.text(m(PH[1] + horiz_offset, PH[0]), 'Phoenix')

The markers for Los Angeles and Las Vegas should have been hollow (on the left side for LA, and fully for LV), but they are not. For half-full markers, such as the marker for San Francisco, I can set the markerfacecoloralt to other colors, but not for fully open markers.

  • Operating system: Windows 10
  • Python version: 3.6.6
  • Basemap version: both 1.1.0 and 1.2.0 have this issue
  • matplotlib version: 2.2.2

Note that I used to not have this issue some time ago, with older versions of matplotlib (I don't remember which).

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/455, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-Ai_7uLKFvfeMdwx7-UdaElM_dV6ks5vYWPegaJpZM4b9Pe4 .

jsh9 commented 5 years ago

I was able to reproduce the result here: https://matplotlib.org/gallery/lines_bars_and_markers/marker_fillstyle_reference.html

For "fill style" equal to "none", the markers are transparent. So it seems that matplotlib is normal.

I am pretty sure the issue didn't come from matplotlib upgrading to v2.0, because when I was able to get proper hollow markers, the matplotlib version I was using was already v2.0+.

Should I open an issue over at matplotlib?

ImportanceOfBeingErnest commented 5 years ago

As shown in https://github.com/matplotlib/matplotlib/issues/13725 this seems to be an issue in matplotlib 2.2.2, which has been fixed in matplotlib 2.2.3.