Skip to content
Snippets Groups Projects
Select Git revision
  • c07d6b29fbd8488a527d1e813feac0181bbdb087
  • master default protected
  • add_logger
  • spheric_talk
  • james_paper
  • ewass_talk
  • updated_contact_list
  • about-page-information
  • eurohack
  • updated_people_list
10 results

mdcomp.py

Blame
  • generate_map.py 1.97 KiB
    import os
    from bokeh.models import ColumnDataSource, WheelZoomTool, HoverTool
    from bokeh.plotting import figure, save
    import numpy as np
    import pandas as pd
    import xyzservices.providers as xyz
    
    # Read in data
    df = pd.read_csv('data/swift_users.txt', sep=r'\s+')
    
    # Convert latitude & longitde to metcator coordinates
    def wgs84_to_web_mercator(lon, lat):
        k = 6378137
        x = lon * (k * np.pi/180.0)
        y = np.log(np.tan((90 + lat) * np.pi/360.0)) * k
        return x, y
    df["x"], df["y"] = wgs84_to_web_mercator(df["Longitude"], df["Latitude"])
    
    # Set map bounds
    min_lon, max_lon = -180, 180
    min_lat, max_lat = -56, 70
    min_x, min_y = wgs84_to_web_mercator(min_lon, min_lat)
    max_x, max_y = wgs84_to_web_mercator(max_lon, max_lat)
    
    # Create map
    p = figure(
        x_range=(min_x, max_x),
        y_range=(min_y, max_y),
        x_axis_type="mercator", y_axis_type="mercator",
        title=None,
        sizing_mode="scale_width",
        aspect_ratio=1.9,
    )
    tile_provider = xyz.CartoDB.Voyager
    p.add_tile(tile_provider)
    
    # Plot users
    for cat, color in [
            ('Community', 'blue'),
            ('Core', 'red'), 
        ]:
        source = ColumnDataSource(df[df['Category'] == cat])
        p.scatter(x="x", y="y", size=15, fill_color=color, fill_alpha=0.8, source=source, line_color='black', line_width=2, legend_label=cat)
    hover = HoverTool(tooltips=[
        ("Institute", "@Name"),
    #    ("Description", "@Description"),
    ])
    p.add_tools(hover)
    
    # Activate wheel zoom
    for tool in p.tools:
        if isinstance(tool, WheelZoomTool):
            p.toolbar.active_scroll = tool
            break
    
    # Apply bounds to the plot ranges
    p.x_range.bounds = (min_x, max_x)
    p.y_range.bounds = (min_y, max_y)
    
    # Zoom level limit
    p.x_range.min_interval = 10**5.5
    p.x_range.max_interval = max_x - min_x
    p.y_range.min_interval = 10**5.5
    p.y_range.max_interval = max_y - min_y
    
    # Legend
    p.legend.location = "top_left"
    p.legend.label_text_font_size = "20pt"
    
    # Save
    os.makedirs('user_map', exist_ok=True) 
    save(p, 'user_map/swift_users.html', title='SWIFT Users', resources='inline')