如何修正ggplot2+ggmap中多边形以点式而非区域绘制的问题
Hey there! It sounds like you’re so close to getting your map perfect—just stuck on why your polygons are showing up as points instead of filled areas. Let’s break down the most likely causes and how to fix them:
1. Check Your Spatial Data’s Geometry Type
First, make sure your data is actually stored as polygon geometry, not points. Accidental data manipulation can convert polygons to points without you noticing.
Run these commands to verify:
# Check the geometry type of your data st_geometry_type(your_polygon_data) # Or check the overall class of your spatial object class(your_polygon_data)
If the output says POINT instead of POLYGON or MULTIPOLYGON, you’ll need to convert it back (if possible) or reimport the original polygon data. If you accidentally cast it to points, reverse it with:
your_fixed_polygons <- st_cast(your_polygon_data, "POLYGON") # Use "MULTIPOLYGON" if your data has multi-part polygons
2. Verify Your Plotting Function & Layers
If you’re using ggplot2, the most common mistake is using geom_point() instead of geom_sf() to render polygons. geom_point() will plot every vertex as a point, which is exactly what you’re seeing.
Example Fix:
Suppose your original code included a point layer you wanted to remove, and you accidentally misused the polygon layer:
# Problematic code ggplot() + geom_point(data = your_data, aes(x = lon, y = lat), shape = 16) + # The point layer you wanted to remove geom_point(data = your_polygon_data) + # Oops—used geom_point for polygons ... # Your existing theme/label settings
Remove the point layer entirely, and use geom_sf() for your polygons:
# Corrected code ggplot() + geom_sf(data = your_polygon_data) + # Renders polygons as filled areas # Keep all your existing theme, label, and scale settings here labs(title = "Your Updated Map") + theme_bw() # Match your original theme
3. Fix Topological Errors in Your Polygon Data
Invalid polygons (like self-intersecting edges or missing parts) can cause R to render them as points instead of areas. Check if your data is valid with:
# Check validity of each polygon entry st_is_valid(your_polygon_data)
If any entries return FALSE, fix the invalid geometries using:
your_valid_polygons <- st_make_valid(your_polygon_data)
Then use this cleaned data in your plot.
4. Double-Check Data Import
If you imported your data from a shapefile or GeoJSON, make sure you used the right function. For spatial data, read_sf() (from the sf package) is the standard—avoid reading polygon data as a regular data frame with read.csv() or similar, which strips spatial attributes and leaves you with just coordinate points.
Correct Import:
library(sf) your_polygon_data <- read_sf("path/to/your/polygon/file.shp")
Once you fix one of these issues, your polygons should render as filled areas instead of points, while keeping all your other map settings intact!
内容的提问来源于stack exchange,提问作者Reiso

