Skip to main content
Use all GeoGraphics options, and shrink ListPlot image size to reduce number of callouts
Source Link
Carl Woll
  • 131.7k
  • 6
  • 246
  • 359

For your updated question

Sometimes some of the other GeoGraphics options need to be included in the Show call, so simplest would be to include them all. This will fix your GeoZoomLevel issue. As for improving label collisions, the size of the ListPlot will control how many callouts are generated. So, adjust the size with the ImageSize option. Examples:

bg = GeoListPlot[{}, GeoBackground -> "ReliefMap", 
    GeoRange -> "World", GeoProjection -> "Mollweide", 
    GeoZoomLevel -> 4
];
plain = {
    First@GeoGridPosition[GeoPosition[data[[1, All, 1]]], "Mollweide"], 
    data[[2]]
};

Your example, including all GeoGraphics options:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1, #2, Appearance -> "CurvedLeader", 
                LeaderSize -> 20, CalloutMarker -> "Arrow",
                LabelStyle -> Directive[FontFamily -> "Verdana", FontSize -> 12, FontColor -> Red],
                CalloutStyle -> Red
            ]&,
            plain
        ], 
        Axes -> None, PlotStyle -> Directive[PointSize[0.005], Red]
    ], 
    Options[bg],
    ImageSize -> 500
]

enter image description here

Shrink the ListPlot image size to reduce the number of callouts:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1, #2, Appearance -> "CurvedLeader", 
                LeaderSize -> 20, CalloutMarker -> "Arrow",
                LabelStyle -> Directive[FontFamily -> "Verdana", FontSize -> 12, FontColor -> Red],
                CalloutStyle -> Red
            ]&,
            plain
        ], 
        Axes -> None, PlotStyle -> Directive[PointSize[0.005], Red],
        ImageSize -> 250
    ], 
    Options[bg],
    ImageSize -> 500
]

enter image description here

For your updated question

Sometimes some of the other GeoGraphics options need to be included in the Show call, so simplest would be to include them all. This will fix your GeoZoomLevel issue. As for improving label collisions, the size of the ListPlot will control how many callouts are generated. So, adjust the size with the ImageSize option. Examples:

bg = GeoListPlot[{}, GeoBackground -> "ReliefMap", 
    GeoRange -> "World", GeoProjection -> "Mollweide", 
    GeoZoomLevel -> 4
];
plain = {
    First@GeoGridPosition[GeoPosition[data[[1, All, 1]]], "Mollweide"], 
    data[[2]]
};

Your example, including all GeoGraphics options:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1, #2, Appearance -> "CurvedLeader", 
                LeaderSize -> 20, CalloutMarker -> "Arrow",
                LabelStyle -> Directive[FontFamily -> "Verdana", FontSize -> 12, FontColor -> Red],
                CalloutStyle -> Red
            ]&,
            plain
        ], 
        Axes -> None, PlotStyle -> Directive[PointSize[0.005], Red]
    ], 
    Options[bg],
    ImageSize -> 500
]

enter image description here

Shrink the ListPlot image size to reduce the number of callouts:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1, #2, Appearance -> "CurvedLeader", 
                LeaderSize -> 20, CalloutMarker -> "Arrow",
                LabelStyle -> Directive[FontFamily -> "Verdana", FontSize -> 12, FontColor -> Red],
                CalloutStyle -> Red
            ]&,
            plain
        ], 
        Axes -> None, PlotStyle -> Directive[PointSize[0.005], Red],
        ImageSize -> 250
    ], 
    Options[bg],
    ImageSize -> 500
]

enter image description here

Add Mollweide projection example
Source Link
Carl Woll
  • 131.7k
  • 6
  • 246
  • 359

Just use Show instead of Overlay:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1,#2,"CalloutStyle"->Directive[Thick,Red]]&,
            plain
        ],
        PlotRange->{{-180,180},{-90,90}},
        Axes->None,
        PlotRangePadding->Scaled[0]
    ]
]

enter image description here

An example using a different projection, where the conversion to grid coordinates is more complicated than just using Reverse:

bg = GeoListPlot[
    {},
    GeoBackground->"ReliefMap",
    GeoRange->"World",
    GeoProjection->"Mollweide"
];
plain = {
    First @ GeoGridPosition[GeoPosition[data[[1, All, 1]]], "Mollweide"],
    data[[2]]
};
Show[
    bg,
    ListPlot[
        MapThread[Callout[#1, #2, "CalloutStyle"->Directive[Thick,Red]]&, plain],
        Axes->None, PlotRangePadding->Scaled[0]
    ],
    Options[bg, PlotRange]
]

enter image description here

Just use Show instead of Overlay:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1,#2,"CalloutStyle"->Directive[Thick,Red]]&,
            plain
        ],
        PlotRange->{{-180,180},{-90,90}},
        Axes->None,
        PlotRangePadding->Scaled[0]
    ]
]

enter image description here

Just use Show instead of Overlay:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1,#2,"CalloutStyle"->Directive[Thick,Red]]&,
            plain
        ],
        PlotRange->{{-180,180},{-90,90}},
        Axes->None,
        PlotRangePadding->Scaled[0]
    ]
]

enter image description here

An example using a different projection, where the conversion to grid coordinates is more complicated than just using Reverse:

bg = GeoListPlot[
    {},
    GeoBackground->"ReliefMap",
    GeoRange->"World",
    GeoProjection->"Mollweide"
];
plain = {
    First @ GeoGridPosition[GeoPosition[data[[1, All, 1]]], "Mollweide"],
    data[[2]]
};
Show[
    bg,
    ListPlot[
        MapThread[Callout[#1, #2, "CalloutStyle"->Directive[Thick,Red]]&, plain],
        Axes->None, PlotRangePadding->Scaled[0]
    ],
    Options[bg, PlotRange]
]

enter image description here

Source Link
Carl Woll
  • 131.7k
  • 6
  • 246
  • 359

Just use Show instead of Overlay:

Show[
    bg,
    ListPlot[
        MapThread[
            Callout[#1,#2,"CalloutStyle"->Directive[Thick,Red]]&,
            plain
        ],
        PlotRange->{{-180,180},{-90,90}},
        Axes->None,
        PlotRangePadding->Scaled[0]
    ]
]

enter image description here