diff --git a/examples/real_world/01_gaia_hr_diagram.ipynb b/examples/real_world/01_gaia_hr_diagram.ipynb index 4d158be2..2cee9064 100644 --- a/examples/real_world/01_gaia_hr_diagram.ipynb +++ b/examples/real_world/01_gaia_hr_diagram.ipynb @@ -113,20 +113,19 @@ "metadata": {}, "outputs": [], "source": [ - "axis_style = {\n", - " \"axis_color\": \"#65708d\",\n", - " \"axis_width\": 1.0,\n", - " \"grid_color\": \"#343755\",\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.58,\n", - " \"grid_width\": 0.8,\n", - " \"label_color\": \"#d7d9e8\",\n", - " \"label_size\": 14,\n", - " \"tick_color\": \"#65708d\",\n", - " \"tick_label_color\": \"#aeb4cb\",\n", - " \"tick_label_size\": 12.5,\n", - " \"tick_length\": 5,\n", - " \"tick_width\": 0.8,\n", + "x_axis_style = {\n", + " \"axis_color\": \"#8e51ff80\",\n", + " \"axis_width\": 1.2,\n", + " \"grid_opacity\": 0,\n", + " \"label_color\": \"#00000000\",\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + "}\n", + "y_axis_style = {\n", + " **x_axis_style,\n", + " \"axis_color\": \"#00000000\",\n", + " \"axis_width\": 0,\n", "}\n", "sequence_label_style = {\n", " \"background\": \"#090b18f2\",\n", @@ -137,6 +136,7 @@ " \"letter_spacing\": \"0.055em\",\n", " \"padding\": \"4px 8px\",\n", "}\n", + "detail_step = max(1, color_index.size // 40_000)\n", "\n", "chart = xy.scatter_chart(\n", " xy.scatter(\n", @@ -149,6 +149,14 @@ " opacity=0.82,\n", " density=True,\n", " ),\n", + " xy.scatter(\n", + " color_index[::detail_step],\n", + " absolute_g[::detail_step],\n", + " color=\"#f0abfc\",\n", + " size=0.65,\n", + " opacity=0.14,\n", + " density=False,\n", + " ),\n", " xy.callout(\n", " 2.35,\n", " 0.8,\n", @@ -156,7 +164,7 @@ " dx=88,\n", " dy=-32,\n", " color=\"#f6a15f\",\n", - " width=1.2,\n", + " width=1.35,\n", " opacity=0.8,\n", " style={**sequence_label_style, \"label_color\": \"#ffc48d\"},\n", " ),\n", @@ -167,7 +175,7 @@ " dx=116,\n", " dy=-22,\n", " color=\"#bca8ff\",\n", - " width=1.2,\n", + " width=1.35,\n", " opacity=0.76,\n", " style={**sequence_label_style, \"label_color\": \"#ddd4ff\"},\n", " ),\n", @@ -178,78 +186,30 @@ " dx=-86,\n", " dy=34,\n", " color=\"#8ed8ff\",\n", - " width=1.2,\n", + " width=1.35,\n", " opacity=0.78,\n", " anchor=\"end\",\n", " style={**sequence_label_style, \"label_color\": \"#bde9ff\"},\n", " ),\n", - " xy.text(\n", - " 0.08,\n", - " 0.965,\n", - " \"GAIA DR3\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#bca8ff\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11.5,\n", - " \"font_weight\": 750,\n", - " \"letter_spacing\": \"0.18em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.08,\n", - " 0.928,\n", - " \"Hertzsprung\\u2013Russell diagram\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#fff5e8\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 25,\n", - " \"font_weight\": 760,\n", - " \"letter_spacing\": \"0.005em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.08,\n", - " 0.872,\n", - " f\"{color_index.size:,} HIGH-CONFIDENCE STARS · BRIGHTER ↑ · BLUE → RED\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#9299b8\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11.5,\n", - " \"font_weight\": 600,\n", - " \"letter_spacing\": \"0.09em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", " xy.x_axis(\n", - " label=\"STELLAR COLOR · BP \\u2212 RP (mag)\",\n", + " label=None,\n", " domain=(-1.0, 5.0),\n", - " tick_values=[-1, 0, 1, 2, 3, 4, 5],\n", - " tick_labels=[\"\\u22121\", \"0\", \"1\", \"2\", \"3\", \"4\", \"5\"],\n", - " style=axis_style,\n", + " tick_label_strategy=\"none\",\n", + " style=x_axis_style,\n", " ),\n", " xy.y_axis(\n", - " label=\"ABSOLUTE G MAGNITUDE\",\n", - " label_offset=-28,\n", + " label=None,\n", " domain=(-6.0, 16.0),\n", " reverse=True,\n", - " tick_values=[-6, -2, 2, 6, 10, 14],\n", - " tick_labels=[\"\\u22126\", \"\\u22122\", \"2\", \"6\", \"10\", \"14\"],\n", - " style=axis_style,\n", + " tick_label_strategy=\"none\",\n", + " style=y_axis_style,\n", " ),\n", " xy.theme(\n", - " background=\"#03040c\",\n", - " plot_background=\"#080916\",\n", + " background=\"#080b16\",\n", + " plot_background=\"#080b16\",\n", " text_color=\"#e9eaf2\",\n", - " grid_color=\"#343755\",\n", - " axis_color=\"#65708d\",\n", + " grid_color=\"#00000000\",\n", + " axis_color=\"#8e51ff80\",\n", " crosshair_color=\"#ffc48d\",\n", " selection_color=\"#bca8ff\",\n", " selection_fill=\"#bca8ff26\",\n", @@ -259,7 +219,7 @@ " \"axis_title\": {\"font_weight\": 680, \"letter_spacing\": \"0.055em\"},\n", " \"tick_label\": {\"font_variant_numeric\": \"tabular-nums\"},\n", " },\n", - " padding=(112, 48, 70, 116),\n", + " padding=(24, 32, 24, 48),\n", " width=1200,\n", " height=700,\n", ")\n", diff --git a/examples/real_world/02_gnomad_allele_frequency.ipynb b/examples/real_world/02_gnomad_allele_frequency.ipynb index b472d2b9..3e2fc747 100644 --- a/examples/real_world/02_gnomad_allele_frequency.ipynb +++ b/examples/real_world/02_gnomad_allele_frequency.ipynb @@ -179,24 +179,18 @@ "rare_variant_share = 100.0 * np.count_nonzero(allele_frequency < 1e-2) / allele_frequency.size\n", "\n", "x_axis_style = {\n", - " \"axis_color\": \"#8094a5\",\n", + " \"axis_color\": \"#2b7fff66\",\n", " \"axis_width\": 1.0,\n", " \"grid_opacity\": 0,\n", - " \"label_color\": \"#19364b\",\n", - " \"label_size\": 14,\n", - " \"tick_color\": \"#8094a5\",\n", - " \"tick_label_color\": \"#40596a\",\n", - " \"tick_label_size\": 11.5,\n", - " \"tick_length\": 5,\n", - " \"tick_width\": 0.8,\n", + " \"label_color\": \"#00000000\",\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", "}\n", "y_axis_style = {\n", " **x_axis_style,\n", - " \"grid_color\": \"#b9cbd6\",\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.78,\n", - " \"grid_width\": 0.8,\n", - " \"tick_label_size\": 12.5,\n", + " \"axis_color\": \"#00000000\",\n", + " \"axis_width\": 0,\n", "}\n", "\n", "chart = xy.scatter_chart(\n", @@ -216,16 +210,6 @@ " opacity=0.72,\n", " density=True,\n", " ),\n", - " *[\n", - " xy.vline(\n", - " boundary,\n", - " color=\"#9db2c0\",\n", - " width=0.7,\n", - " opacity=0.5,\n", - " style={\"dash\": \"2,5\"},\n", - " )\n", - " for boundary in chromosome_boundaries\n", - " ],\n", " xy.hline(\n", " 1e-2,\n", " color=\"#087e8b\",\n", @@ -260,77 +244,24 @@ " \"letter_spacing\": \"0.075em\",\n", " },\n", " ),\n", - " xy.text(\n", - " 0.08,\n", - " 0.965,\n", - " \"gnomAD v4.1 / Allele-frequency atlas\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#102f44\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 24,\n", - " \"font_weight\": 760,\n", - " \"letter_spacing\": \"0.01em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.08,\n", - " 0.912,\n", - " (\n", - " f\"{genomic_position.size:,} VARIANTS · {len(chromosomes)} AUTOSOMES · \"\n", - " f\"{windows_per_chromosome} INDEXED WINDOWS EACH\"\n", - " ),\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#597487\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11.5,\n", - " \"font_weight\": 600,\n", - " \"letter_spacing\": \"0.085em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.95,\n", - " 0.955,\n", - " \"AF · LOG₁₀ SCALE\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#087e8b\",\n", - " anchor=\"end\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.09em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", " xy.x_axis(\n", - " label=\"CHROMOSOME\",\n", - " tick_values=tick_values,\n", - " tick_labels=tick_labels,\n", - " tick_label_min_gap=0,\n", + " label=None,\n", + " tick_label_strategy=\"none\",\n", " style=x_axis_style,\n", " ),\n", " xy.y_axis(\n", - " label=\"ALTERNATE ALLELE FREQUENCY\",\n", - " label_offset=-28,\n", + " label=None,\n", " type_=\"log\",\n", " domain=(1e-7, 1.0),\n", - " tick_values=[1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1.0],\n", - " tick_labels=[\"10⁻⁷\", \"10⁻⁶\", \"10⁻⁵\", \"10⁻⁴\", \"10⁻³\", \"10⁻²\", \"10⁻¹\", \"1\"],\n", + " tick_label_strategy=\"none\",\n", " style=y_axis_style,\n", " ),\n", " xy.theme(\n", - " background=\"#f2f8fb\",\n", - " plot_background=\"#fbfdfe\",\n", + " background=\"#f8fafc\",\n", + " plot_background=\"#f8fafc\",\n", " text_color=\"#19364b\",\n", - " grid_color=\"#b9cbd6\",\n", - " axis_color=\"#8094a5\",\n", + " grid_color=\"#00000000\",\n", + " axis_color=\"#2b7fff66\",\n", " crosshair_color=\"#087e8b\",\n", " selection_color=\"#075985\",\n", " selection_fill=\"#0891b226\",\n", @@ -340,7 +271,7 @@ " \"axis_title\": {\"font_weight\": 680, \"letter_spacing\": \"0.055em\"},\n", " \"tick_label\": {\"font_variant_numeric\": \"tabular-nums\"},\n", " },\n", - " padding=(96, 48, 78, 116),\n", + " padding=(36, 48, 42, 72),\n", " width=1200,\n", " height=700,\n", ")\n", diff --git a/examples/real_world/03_pan_ukbb_manhattan.ipynb b/examples/real_world/03_pan_ukbb_manhattan.ipynb index f53975d4..099c79c6 100644 --- a/examples/real_world/03_pan_ukbb_manhattan.ipynb +++ b/examples/real_world/03_pan_ukbb_manhattan.ipynb @@ -168,10 +168,9 @@ "tick_labels = [str(chromosome) for chromosome in CHROMOSOME_LENGTHS]\n", "chromosome_boundaries = [offsets[chromosome] for chromosome in range(2, 23)]\n", "\n", - "# Equal-luminance aubergine and ochre distinguish adjacent chromosomes\n", - "# without giving either half of the genome more visual weight.\n", - "aubergine = np.array([116, 77, 104, 255], dtype=np.float32) / 255\n", - "ochre = np.array([129, 84, 47, 255], dtype=np.float32) / 255\n", + "# Violet and coral distinguish adjacent chromosomes in the compact hero.\n", + "aubergine = np.array([124, 58, 237, 255], dtype=np.float32) / 255\n", + "ochre = np.array([251, 113, 133, 255], dtype=np.float32) / 255\n", "point_rgba = np.empty((chromosome_number.size, 4), dtype=np.float32)\n", "odd_chromosome = chromosome_number % 2 == 1\n", "point_rgba[odd_chromosome] = aubergine\n", @@ -180,6 +179,8 @@ "chr20_indices = np.flatnonzero(chromosome_number == 20)\n", "chr20_peak_index = int(chr20_indices[np.argmax(neglog10_pvalue[chr20_indices])])\n", "other_peak_index = int(np.argmax(np.where(chromosome_number == 20, -np.inf, neglog10_pvalue)))\n", + "display_y_max = 180.0\n", + "off_scale_y = 172.0\n", "peak_specs = (\n", " (chr20_peak_index, -14, 18, \"end\"),\n", " (other_peak_index, 14, -24, \"start\"),\n", @@ -188,9 +189,15 @@ "for peak_index, _, _, _ in peak_specs:\n", " chromosome = int(chromosome_number[peak_index])\n", " position = int(genomic_position[peak_index] - offsets[chromosome])\n", + " value = float(neglog10_pvalue[peak_index])\n", + " suffix = \" · OFF-SCALE\" if value > display_y_max else \"\"\n", " peak_labels.append(\n", - " f\"CHR {chromosome} · {position / 1e6:.1f} MB · −LOG₁₀(P) {neglog10_pvalue[peak_index]:.1f}\" # noqa: RUF001\n", + " f\"CHR {chromosome} · {position / 1e6:.1f} MB · −LOG₁₀(P) {value:.1f}{suffix}\" # noqa: RUF001\n", " )\n", + "peak_display_y = np.minimum(\n", + " neglog10_pvalue[[chr20_peak_index, other_peak_index]],\n", + " off_scale_y,\n", + ")\n", "\n", "genome_wide_threshold = -np.log10(5e-8)\n", "\n", @@ -203,16 +210,6 @@ " opacity=0.78,\n", " density=True,\n", " ),\n", - " *[\n", - " xy.vline(\n", - " boundary,\n", - " color=\"#b7ab9b\",\n", - " width=0.7,\n", - " opacity=0.46,\n", - " style={\"dash\": \"2,5\"},\n", - " )\n", - " for boundary in chromosome_boundaries\n", - " ],\n", " xy.hline(\n", " genome_wide_threshold,\n", " color=\"#a33a32\",\n", @@ -239,17 +236,17 @@ " ),\n", " xy.scatter(\n", " genomic_position[[chr20_peak_index, other_peak_index]],\n", - " neglog10_pvalue[[chr20_peak_index, other_peak_index]],\n", + " peak_display_y,\n", " color=\"#fffdf8\",\n", " stroke=\"#81542f\",\n", " stroke_width=2,\n", - " size=6,\n", + " size=7,\n", " opacity=1,\n", " ),\n", " *[\n", " xy.text(\n", " float(genomic_position[peak_index]),\n", - " float(neglog10_pvalue[peak_index]),\n", + " float(peak_display_y[peak_number]),\n", " label,\n", " dx=dx,\n", " dy=dy,\n", @@ -258,105 +255,42 @@ " style={\n", " \"background\": \"#fffdf8f2\",\n", " \"border\": \"1px solid #cdbfaf\",\n", - " \"border_radius\": 2,\n", + " \"border_radius\": 6,\n", " \"font_size\": 11.5,\n", " \"font_weight\": 700,\n", " \"letter_spacing\": \"0.025em\",\n", " \"padding\": \"3px 6px\",\n", " },\n", " )\n", - " for (peak_index, dx, dy, anchor), label in zip(peak_specs, peak_labels, strict=True)\n", + " for peak_number, ((peak_index, dx, dy, anchor), label) in enumerate(\n", + " zip(peak_specs, peak_labels, strict=True)\n", + " )\n", " ],\n", - " xy.text(\n", - " 0.102,\n", - " 0.965,\n", - " \"PAN-UK BIOBANK / STANDING-HEIGHT GWAS\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#50354a\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 22,\n", - " \"font_weight\": 750,\n", - " \"letter_spacing\": \"0.025em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.102,\n", - " 0.918,\n", - " f\"{genomic_position.size:,} VARIANTS · 22 AUTOSOMES\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#766b60\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11.5,\n", - " \"font_weight\": 600,\n", - " \"letter_spacing\": \"0.045em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.965,\n", - " 0.918,\n", - " \"PAN-ANCESTRY META-ANALYSIS\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#766b60\",\n", - " anchor=\"end\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11.5,\n", - " \"font_weight\": 600,\n", - " \"letter_spacing\": \"0.045em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.535,\n", - " 0.04,\n", - " \"CHROMOSOME\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#342f2a\",\n", - " anchor=\"middle\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 11.5,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.07em\",\n", - " },\n", - " ),\n", " xy.x_axis(\n", " label=None,\n", - " tick_values=tick_values,\n", - " tick_labels=tick_labels,\n", + " tick_label_strategy=\"none\",\n", " style={\n", " \"grid_opacity\": 0,\n", - " \"axis_color\": \"#6f665c\",\n", + " \"axis_color\": \"#7c3aed66\",\n", " \"axis_width\": 1.2,\n", - " \"tick_color\": \"#8f8375\",\n", - " \"tick_width\": 1,\n", - " \"tick_length\": 5,\n", - " \"tick_label_color\": \"#4a433c\",\n", - " \"label_color\": \"#342f2a\",\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", " },\n", " ),\n", " xy.y_axis(\n", - " label=\"Association significance, \\u2212log₁₀(P)\",\n", - " label_offset=-16,\n", - " tick_count=7,\n", + " label=None,\n", + " domain=(0, display_y_max),\n", + " tick_label_strategy=\"none\",\n", " style={\n", - " \"grid_color\": \"#d8d0c3\",\n", - " \"grid_width\": 1,\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.9,\n", - " \"axis_color\": \"#6f665c\",\n", - " \"axis_width\": 1.2,\n", - " \"tick_color\": \"#8f8375\",\n", - " \"tick_label_color\": \"#4a433c\",\n", - " \"label_color\": \"#342f2a\",\n", + " \"grid_opacity\": 0,\n", + " \"axis_color\": \"#00000000\",\n", + " \"axis_width\": 0,\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", " },\n", " ),\n", " xy.legend(show=False),\n", @@ -371,11 +305,11 @@ " double_click_reset=True,\n", " ),\n", " xy.theme(\n", - " background=\"#f3eee4\",\n", - " plot_background=\"#fffdf8\",\n", + " background=\"#fffaf5\",\n", + " plot_background=\"#fffaf5\",\n", " text_color=\"#2c2824\",\n", - " grid_color=\"#d8d0c3\",\n", - " axis_color=\"#6f665c\",\n", + " grid_color=\"#00000000\",\n", + " axis_color=\"#7c3aed66\",\n", " crosshair_color=\"#a33a32\",\n", " selection_color=\"#71465f\",\n", " selection_fill=\"#71465f24\",\n", @@ -393,12 +327,11 @@ " \"annotation_label\": {\"font_weight\": 650},\n", " },\n", " style={\n", - " \"border\": \"1px solid #d4cabc\",\n", - " \"font_family\": \"Georgia, 'Times New Roman', serif\",\n", + " \"font_family\": \"Avenir Next, ui-sans-serif, sans-serif\",\n", " },\n", " width=1150,\n", " height=620,\n", - " padding=(100, 42, 94, 122),\n", + " padding=(24, 32, 24, 48),\n", ")\n", "print(chart.memory_report()[\"canonical_bytes\"], \"canonical bytes\")\n", "chart" diff --git a/examples/real_world/04_dukascopy_fx_ticks.ipynb b/examples/real_world/04_dukascopy_fx_ticks.ipynb index 9724206b..0b158172 100644 --- a/examples/real_world/04_dukascopy_fx_ticks.ipynb +++ b/examples/real_world/04_dukascopy_fx_ticks.ipynb @@ -167,18 +167,17 @@ "pip_size = 0.01 if SYMBOL.endswith(\"JPY\") else 0.0001\n", "day_change_pips = day_change / pip_size\n", "day_direction = \"UP\" if day_change > 0 else \"DOWN\" if day_change < 0 else \"FLAT\"\n", - "day_change_color = \"#7ce8bc\" if day_change >= 0 else \"#ff9f8c\"\n", + "day_change_color = \"#00bc7d\" if day_change >= 0 else \"#fb7185\"\n", "last_timestamp_ms = int(timestamps[-1].astype(\"datetime64[ms]\").astype(np.int64))\n", "\n", - "# Subtle regional-session bands make the intraday rhythm legible while\n", + "# Distinct low-luminance session bands remain readable at thumbnail size\n", "# preserving every tick in the interactive canonical series.\n", "session_bands = []\n", - "session_boundaries = []\n", "session_labels = []\n", "session_specs = (\n", - " (0, 7, \"ASIA\", \"#17364a\"),\n", - " (7, 13, \"LONDON\", \"#173b32\"),\n", - " (13, 21, \"NEW YORK\", \"#3b3020\"),\n", + " (0, 7, \"ASIA\", \"#0b2a4a\"),\n", + " (7, 13, \"LONDON\", \"#0a382f\"),\n", + " (13, 21, \"NEW YORK\", \"#3d2b0d\"),\n", ")\n", "for day_offset in range(DAYS):\n", " session_start = datetime.combine(START + timedelta(days=day_offset), time())\n", @@ -188,11 +187,11 @@ " session_start + timedelta(hours=start_hour),\n", " session_start + timedelta(hours=end_hour),\n", " color=color,\n", - " opacity=0.12,\n", + " opacity=0.32,\n", " )\n", " )\n", " if day_offset == 0:\n", - " label_color = {\"ASIA\": \"#79b9d8\", \"LONDON\": \"#6fd4ad\", \"NEW YORK\": \"#d8b36f\"}[label]\n", + " label_color = {\"ASIA\": \"#bfdbfe\", \"LONDON\": \"#a7f3d0\", \"NEW YORK\": \"#fde68a\"}[label]\n", " session_labels.append(\n", " xy.text(\n", " session_start + timedelta(hours=(start_hour + end_hour) / 2),\n", @@ -203,31 +202,25 @@ " color=label_color,\n", " anchor=\"middle\",\n", " style={\n", - " \"font_size\": 10,\n", + " \"background\": f\"{color}d9\",\n", + " \"border\": f\"1px solid {label_color}66\",\n", + " \"border_radius\": 5,\n", + " \"font_size\": 10.5,\n", " \"font_weight\": 750,\n", " \"letter_spacing\": \"0.08em\",\n", + " \"padding\": \"3px 8px\",\n", " },\n", " )\n", " )\n", - " for boundary_hour in (7, 13, 21):\n", - " session_boundaries.append(\n", - " xy.vline(\n", - " session_start + timedelta(hours=boundary_hour),\n", - " color=\"#405268\",\n", - " width=1,\n", - " opacity=0.65,\n", - " )\n", - " )\n", "\n", "period_end = START + timedelta(days=DAYS - 1)\n", "period_label = START.isoformat() if DAYS == 1 else f\"{START.isoformat()} → {period_end.isoformat()}\"\n", "\n", "chart = xy.line_chart(\n", " *session_bands,\n", - " *session_boundaries,\n", " xy.hline(\n", " session_rail_floor,\n", - " color=\"#405268\",\n", + " color=\"#475569\",\n", " width=1,\n", " opacity=0.72,\n", " ),\n", @@ -236,13 +229,13 @@ " timestamps,\n", " midpoint,\n", " name=f\"{pair} midpoint\",\n", - " color=\"#42e6a4\",\n", + " color=\"#38bdf8\",\n", " width=1.7,\n", " ),\n", " xy.line(\n", " [timestamps[0], timestamps[-1]],\n", " [midpoint[-1], midpoint[-1]],\n", - " color=\"#8af7cb\",\n", + " color=\"#7dd3fc\",\n", " width=1,\n", " opacity=0.62,\n", " dash=[5, 5],\n", @@ -253,11 +246,11 @@ " f\"LAST · {midpoint[-1]:.{price_decimals}f}\",\n", " dx=10,\n", " dy=0,\n", - " color=\"#8af7cb\",\n", + " color=\"#7dd3fc\",\n", " anchor=\"start\",\n", " style={\n", " \"background\": \"#071521\",\n", - " \"border\": \"1px solid #42e6a480\",\n", + " \"border\": \"1px solid #38bdf880\",\n", " \"border_radius\": 4,\n", " \"font_size\": 10.5,\n", " \"font_weight\": 750,\n", @@ -267,36 +260,6 @@ " },\n", " ),\n", " xy.text(\n", - " 0.097,\n", - " 0.965,\n", - " f\"{pair} / INTRADAY TICK TAPE\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#8af7cb\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 20,\n", - " \"font_weight\": 750,\n", - " \"letter_spacing\": \"0.045em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.097,\n", - " 0.918,\n", - " f\"{period_label} · {midpoint.size:,} TICKS · DUKASCOPY HISTORICAL FEED\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#8292a5\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 10.5,\n", - " \"font_weight\": 600,\n", - " \"letter_spacing\": \"0.035em\",\n", - " \"vertical_align\": \"top\",\n", - " },\n", - " ),\n", - " xy.text(\n", " 0.882,\n", " 0.959,\n", " f\"DAY {day_direction} {day_change_percent:+.2f}% · {day_change_pips:+.1f} PIPS\",\n", @@ -313,36 +276,32 @@ " },\n", " ),\n", " xy.x_axis(\n", - " label=\"TIME · UTC\",\n", + " label=None,\n", " type_=\"time\",\n", " domain=(int(timestamps[0].astype(np.int64)), last_timestamp_ms),\n", + " tick_label_strategy=\"none\",\n", " style={\n", - " \"grid_color\": \"#223044\",\n", - " \"grid_width\": 1,\n", - " \"grid_opacity\": 0.45,\n", - " \"axis_color\": \"#55657a\",\n", + " \"grid_opacity\": 0,\n", + " \"axis_color\": \"#38bdf866\",\n", " \"axis_width\": 1.2,\n", - " \"tick_color\": \"#55657a\",\n", - " \"tick_label_color\": \"#a8b5c5\",\n", - " \"label_color\": \"#8af7cb\",\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", " },\n", " ),\n", " xy.y_axis(\n", - " label=f\"{pair} · MID\",\n", - " label_offset=-28,\n", + " label=None,\n", " domain=(price_floor - price_step * 0.2, price_ceiling + price_step * 0.38),\n", - " tick_values=price_ticks,\n", - " tick_labels=price_tick_labels,\n", + " tick_label_strategy=\"none\",\n", " style={\n", - " \"grid_color\": \"#26354a\",\n", - " \"grid_width\": 1,\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.8,\n", - " \"axis_color\": \"#55657a\",\n", - " \"axis_width\": 1.2,\n", - " \"tick_color\": \"#55657a\",\n", - " \"tick_label_color\": \"#c5d0dc\",\n", - " \"label_color\": \"#8af7cb\",\n", + " \"grid_opacity\": 0,\n", + " \"axis_color\": \"#00000000\",\n", + " \"axis_width\": 0,\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", " },\n", " ),\n", " xy.legend(show=False),\n", @@ -357,14 +316,14 @@ " double_click_reset=True,\n", " ),\n", " xy.theme(\n", - " background=\"#05080d\",\n", - " plot_background=\"#08111b\",\n", + " background=\"#070b14\",\n", + " plot_background=\"#070b14\",\n", " text_color=\"#c8d3df\",\n", - " grid_color=\"#26354a\",\n", - " axis_color=\"#55657a\",\n", + " grid_color=\"#00000000\",\n", + " axis_color=\"#38bdf866\",\n", " crosshair_color=\"#f0c96a\",\n", - " selection_color=\"#42e6a4\",\n", - " selection_fill=\"#42e6a424\",\n", + " selection_color=\"#38bdf8\",\n", + " selection_fill=\"#38bdf824\",\n", " ),\n", " styles={\n", " \"axis_title\": {\"font_weight\": 700, \"letter_spacing\": \"0.06em\"},\n", @@ -382,12 +341,11 @@ " },\n", " },\n", " style={\n", - " \"border\": \"1px solid #172838\",\n", " \"font_family\": \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n", " },\n", " width=1150,\n", " height=560,\n", - " padding=(98, 142, 68, 116),\n", + " padding=(48, 142, 42, 72),\n", ")\n", "payload = chart.figure().build_payload()[0]\n", "print(\"render tier:\", payload[\"traces\"][0][\"tier\"])\n", diff --git a/examples/real_world/05_ligo_gw150914_strain.ipynb b/examples/real_world/05_ligo_gw150914_strain.ipynb index a282275b..f51ba990 100644 --- a/examples/real_world/05_ligo_gw150914_strain.ipynb +++ b/examples/real_world/05_ligo_gw150914_strain.ipynb @@ -136,94 +136,67 @@ "full_y_bounds = (float(np.nanmin(strain)), float(np.nanmax(strain)))\n", "\n", "SIGNAL_FONT = \"IBM Plex Mono, ui-monospace, monospace\"\n", - "SIGNAL_AXIS_STYLE = {\n", - " \"grid_color\": \"#173640\",\n", - " \"grid_width\": 1,\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.62,\n", - " \"axis_color\": \"#3d7380\",\n", + "SIGNAL_X_AXIS_STYLE = {\n", + " \"grid_opacity\": 0,\n", + " \"axis_color\": \"#6366f166\",\n", " \"axis_width\": 1,\n", - " \"tick_color\": \"#43f4ff\",\n", - " \"tick_width\": 1,\n", - " \"tick_length\": 5,\n", - " \"tick_label_color\": \"#a9ccd2\",\n", - " \"label_color\": \"#d7f9fc\",\n", - " \"tick_label_size\": 12,\n", - " \"label_size\": 12,\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", + "}\n", + "SIGNAL_Y_AXIS_STYLE = {\n", + " **SIGNAL_X_AXIS_STYLE,\n", + " \"axis_color\": \"#00000000\",\n", + " \"axis_width\": 0,\n", "}\n", "SIGNAL_THEME = xy.theme(\n", - " background=\"#03070b\",\n", - " plot_background=\"#061116\",\n", - " text_color=\"#d7f9fc\",\n", - " grid_color=\"#173640\",\n", - " axis_color=\"#3d7380\",\n", - " crosshair_color=\"#ff4f91\",\n", - " selection_color=\"#43f4ff\",\n", - " selection_fill=\"#43f4ff22\",\n", + " background=\"#090d16\",\n", + " plot_background=\"#090d16\",\n", + " text_color=\"#e5e7eb\",\n", + " grid_color=\"#00000000\",\n", + " axis_color=\"#6366f166\",\n", + " crosshair_color=\"#fbbf24\",\n", + " selection_color=\"#818cf8\",\n", + " selection_fill=\"#818cf822\",\n", ")\n", "SIGNAL_STYLES = {\n", " \"tick_label\": {\"font_family\": SIGNAL_FONT},\n", " \"axis_title\": {\"font_family\": SIGNAL_FONT, \"letter_spacing\": \"0.05em\"},\n", " \"annotation_label\": {\"font_family\": SIGNAL_FONT},\n", " \"tooltip\": {\n", - " \"background\": \"#07151a\",\n", - " \"color\": \"#d7f9fc\",\n", - " \"border\": \"1px solid #2b7680\",\n", + " \"background\": \"#111827\",\n", + " \"color\": \"#e5e7eb\",\n", + " \"border\": \"1px solid #334155\",\n", " \"border_radius\": 5,\n", " \"font_family\": SIGNAL_FONT,\n", " },\n", "}\n", - "SIGNAL_CARD = {\"border\": \"1px solid #173640\", \"font_family\": SIGNAL_FONT}\n", + "SIGNAL_CARD = {\"font_family\": SIGNAL_FONT}\n", "\n", "overview_chart = xy.line_chart(\n", " xy.line(\n", " seconds_from_event,\n", " strain,\n", " name=f\"{DETECTOR} · raw strain\",\n", - " color=\"#43f4ff\",\n", - " width=1.0,\n", - " opacity=0.72,\n", - " ),\n", - " xy.vline(0, color=\"#ff4f91\", width=2, opacity=0.95, style={\"dash\": \"6,5\"}),\n", - " xy.text(\n", - " 0.111,\n", - " 0.925,\n", - " \"4096-SECOND RAW RECORD\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#f1fdff\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 20,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.04em\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.111,\n", - " 0.85,\n", - " f\"{EVENT} / {DETECTOR} / {1 / x_spacing:,.0f} HZ / {strain.size / 1e6:.1f}M SAMPLES\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#79a7af\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 10,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.09em\",\n", - " },\n", + " color=\"#a5b4fc\",\n", + " width=1.1,\n", + " opacity=0.85,\n", " ),\n", + " xy.vline(0, color=\"#fbbf24\", width=1.5, opacity=0.85, style={\"dash\": \"8,6\"}),\n", " xy.x_axis(\n", " label=\"TIME FROM EVENT / seconds\",\n", " domain=full_x_bounds,\n", " bounds=full_x_bounds,\n", - " style=SIGNAL_AXIS_STYLE,\n", + " tick_label_strategy=\"none\",\n", + " style=SIGNAL_X_AXIS_STYLE,\n", " ),\n", " xy.y_axis(\n", " label=\"RAW DETECTOR STRAIN h(t)\",\n", " label_offset=-16,\n", " bounds=full_y_bounds,\n", - " style=SIGNAL_AXIS_STYLE,\n", + " tick_label_strategy=\"none\",\n", + " style=SIGNAL_Y_AXIS_STYLE,\n", " ),\n", " xy.tooltip(title=f\"{DETECTOR} RAW STRAIN\", format={\"x\": \"+.1f\", \"y\": \".3e\"}),\n", " xy.legend(show=False),\n", @@ -233,7 +206,7 @@ " style=SIGNAL_CARD,\n", " width=1150,\n", " height=360,\n", - " padding=(82, 32, 66, 128),\n", + " padding=(28, 32, 42, 72),\n", ")\n", "overview_payload = overview_chart.figure().build_payload()[0]\n", "print(\"overview render tier:\", overview_payload[\"traces\"][0][\"tier\"])\n", @@ -289,27 +262,27 @@ " detail_time,\n", " bandpassed_strain,\n", " name=f\"{DETECTOR} · 35-350 Hz bandpass glow\",\n", - " color=\"#43f4ff\",\n", - " width=5.0,\n", - " opacity=0.10,\n", + " color=\"#6366f1\",\n", + " width=4.0,\n", + " opacity=0.09,\n", " ),\n", " xy.line(\n", " detail_time,\n", " bandpassed_strain,\n", " name=f\"{DETECTOR} · 35-350 Hz bandpass\",\n", - " color=\"#55e8ff\",\n", - " width=1.35,\n", - " opacity=0.96,\n", + " color=\"#a5b4fc\",\n", + " width=1.5,\n", + " opacity=0.98,\n", " ),\n", - " xy.hline(0, color=\"#2b7680\", width=1, opacity=0.68),\n", - " xy.vline(0, color=\"#ff4f91\", width=2.25, opacity=0.98, style={\"dash\": \"7,5\"}),\n", + " xy.hline(0, color=\"#64748b\", width=1, opacity=0.45),\n", + " xy.vline(0, color=\"#fbbf24\", width=1.5, opacity=0.88, style={\"dash\": \"8,6\"}),\n", " xy.text(\n", " 0,\n", " detail_y_bound * 0.88,\n", " \"GWOSC EVENT REFERENCE / t = 0\",\n", " dx=-12,\n", " dy=-6,\n", - " color=\"#ff4f91\",\n", + " color=\"#fbbf24\",\n", " anchor=\"end\",\n", " style={\"font_size\": 12, \"font_weight\": 700, \"letter_spacing\": \"0.06em\"},\n", " ),\n", @@ -319,51 +292,24 @@ " \"LATE INSPIRAL\",\n", " dx=-86,\n", " dy=-46,\n", - " color=\"#8ddfeb\",\n", + " color=\"#93c5fd\",\n", " width=1.25,\n", " anchor=\"end\",\n", " style={\n", " \"font_size\": 12,\n", " \"font_weight\": 700,\n", - " \"label_color\": \"#d7f9fc\",\n", + " \"label_color\": \"#dbeafe\",\n", " \"letter_spacing\": \"0.06em\",\n", " },\n", " ),\n", - " xy.text(\n", - " 0.136,\n", - " 0.94,\n", - " EVENT,\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#f1fdff\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 26,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.025em\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.136,\n", - " 0.895,\n", - " f\"{DETECTOR_SITES[DETECTOR]} {DETECTOR} / {1 / x_spacing:,.0f} HZ / 35-350 HZ BANDPASS\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#79a7af\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 10,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.09em\",\n", - " },\n", - " ),\n", " xy.x_axis(\n", " label=\"TIME FROM GWOSC EVENT REFERENCE / seconds\",\n", " domain=visible_domain,\n", " bounds=(float(detail_time[0]), float(detail_time[-1])),\n", " tick_values=[-0.15, -0.10, -0.05, 0, 0.05],\n", " tick_labels=[\"-0.15\", \"-0.10\", \"-0.05\", \"0\", \"+0.05\"],\n", - " style=SIGNAL_AXIS_STYLE,\n", + " tick_label_strategy=\"none\",\n", + " style=SIGNAL_X_AXIS_STYLE,\n", " ),\n", " xy.y_axis(\n", " label=\"BANDPASSED STRAIN / \\u00d7 10\\u207b\\u00b2\\u00b9\",\n", @@ -372,7 +318,8 @@ " bounds=(float(np.nanmin(bandpassed_strain)), float(np.nanmax(bandpassed_strain))),\n", " tick_values=[-4, -2, 0, 2, 4],\n", " tick_labels=[\"-4\", \"-2\", \"0\", \"+2\", \"+4\"],\n", - " style=SIGNAL_AXIS_STYLE,\n", + " tick_label_strategy=\"none\",\n", + " style=SIGNAL_Y_AXIS_STYLE,\n", " ),\n", " xy.tooltip(\n", " title=f\"{DETECTOR} 35-350 Hz BANDPASS\",\n", @@ -391,7 +338,7 @@ " style=SIGNAL_CARD,\n", " width=1150,\n", " height=620,\n", - " padding=(96, 36, 80, 156),\n", + " padding=(32, 36, 42, 72),\n", ")\n", "detail_payload = bandpassed_chart.figure().build_payload()[0]\n", "print(\"event-detail render tier:\", detail_payload[\"traces\"][1][\"tier\"])\n", @@ -437,27 +384,27 @@ " reconstruction_seconds,\n", " reconstructed_strain,\n", " name=\"H1 reconstructed strain · glow\",\n", - " color=\"#43f4ff\",\n", - " width=5.5,\n", - " opacity=0.10,\n", + " color=\"#6366f1\",\n", + " width=4.0,\n", + " opacity=0.09,\n", " ),\n", " xy.line(\n", " reconstruction_seconds,\n", " reconstructed_strain,\n", " name=\"H1 reconstructed strain\",\n", - " color=\"#55e8ff\",\n", - " width=1.45,\n", + " color=\"#a5b4fc\",\n", + " width=1.55,\n", " opacity=0.98,\n", " ),\n", - " xy.hline(0, color=\"#2b7680\", width=1, opacity=0.68),\n", - " xy.vline(0, color=\"#ff4f91\", width=2.25, opacity=0.98, style={\"dash\": \"7,5\"}),\n", + " xy.hline(0, color=\"#64748b\", width=1, opacity=0.45),\n", + " xy.vline(0, color=\"#fbbf24\", width=1.5, opacity=0.88, style={\"dash\": \"8,6\"}),\n", " xy.text(\n", " 0,\n", " 1.40,\n", " \"PEAK STRAIN / t = 0\",\n", " dx=-12,\n", " dy=-6,\n", - " color=\"#ff4f91\",\n", + " color=\"#fbbf24\",\n", " anchor=\"end\",\n", " style={\"font_size\": 13, \"font_weight\": 700, \"letter_spacing\": \"0.06em\"},\n", " ),\n", @@ -467,13 +414,13 @@ " \"AMPLITUDE + FREQUENCY RISE\",\n", " dx=-132,\n", " dy=-58,\n", - " color=\"#8ddfeb\",\n", + " color=\"#93c5fd\",\n", " width=1.25,\n", " anchor=\"start\",\n", " style={\n", " \"font_size\": 13,\n", " \"font_weight\": 700,\n", - " \"label_color\": \"#d7f9fc\",\n", + " \"label_color\": \"#dbeafe\",\n", " \"letter_spacing\": \"0.05em\",\n", " },\n", " ),\n", @@ -483,66 +430,24 @@ " \"RINGDOWN\",\n", " dx=-66,\n", " dy=-42,\n", - " color=\"#ff6fa7\",\n", + " color=\"#fbbf24\",\n", " width=1.25,\n", " anchor=\"end\",\n", " style={\n", " \"font_size\": 13,\n", " \"font_weight\": 700,\n", - " \"label_color\": \"#ffd3e4\",\n", + " \"label_color\": \"#fde68a\",\n", " \"letter_spacing\": \"0.07em\",\n", " },\n", " ),\n", - " xy.text(\n", - " 0.137,\n", - " 0.94,\n", - " EVENT,\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#f1fdff\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 26,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.025em\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.137,\n", - " 0.895,\n", - " \"HANFORD H1 / OFFICIAL GWOSC TEMPLATE RECONSTRUCTION / PEAK-ALIGNED\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#79a7af\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 10,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.085em\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " 0.963,\n", - " 0.925,\n", - " \"14 SEP 2015 / 09:50:45 UTC\",\n", - " dx=0,\n", - " dy=0,\n", - " color=\"#ff6fa7\",\n", - " anchor=\"end\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 10,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.075em\",\n", - " },\n", - " ),\n", " xy.x_axis(\n", " label=\"TIME FROM PEAK STRAIN / seconds\",\n", " domain=(-0.15, 0.055),\n", " bounds=(float(reconstruction_seconds[0]), float(reconstruction_seconds[-1])),\n", " tick_values=[-0.15, -0.10, -0.05, 0, 0.05],\n", " tick_labels=[\"-0.15\", \"-0.10\", \"-0.05\", \"0\", \"+0.05\"],\n", - " style=SIGNAL_AXIS_STYLE,\n", + " tick_label_strategy=\"none\",\n", + " style=SIGNAL_X_AXIS_STYLE,\n", " ),\n", " xy.y_axis(\n", " label=\"RECONSTRUCTED STRAIN / \\u00d7 10\\u207b\\u00b2\\u00b9\",\n", @@ -551,7 +456,8 @@ " bounds=reconstruction_bounds,\n", " tick_values=[-1.0, -0.5, 0, 0.5, 1.0],\n", " tick_labels=[\"-1.0\", \"-0.5\", \"0\", \"+0.5\", \"+1.0\"],\n", - " style=SIGNAL_AXIS_STYLE,\n", + " tick_label_strategy=\"none\",\n", + " style=SIGNAL_Y_AXIS_STYLE,\n", " ),\n", " xy.tooltip(\n", " title=\"H1 GWOSC TEMPLATE RECONSTRUCTION\",\n", @@ -570,7 +476,7 @@ " style=SIGNAL_CARD,\n", " width=1200,\n", " height=700,\n", - " padding=(102, 44, 90, 164),\n", + " padding=(32, 44, 42, 72),\n", ")\n", "chart" ] diff --git a/examples/real_world/06_nyc_taxi_density.ipynb b/examples/real_world/06_nyc_taxi_density.ipynb index 40a2a60e..a4e2c74d 100644 --- a/examples/real_world/06_nyc_taxi_density.ipynb +++ b/examples/real_world/06_nyc_taxi_density.ipynb @@ -134,13 +134,14 @@ "outputs": [], "source": [ "MAP_LONGITUDE_DOMAIN = (-74.035, -73.765)\n", - "MAP_Y_DOMAIN = (40.635, 40.865)\n", + "# Tight hero crop keeps Manhattan, LGA, and JFK visible with minimal dead space.\n", + "MAP_Y_DOMAIN = (40.635, 40.825)\n", "MAP_REFERENCE_LONGITUDE = -73.90\n", "MAP_REFERENCE_LATITUDE = 40.75\n", "MAP_LONGITUDE_SCALE = float(np.cos(np.deg2rad(MAP_REFERENCE_LATITUDE)))\n", "HERO_WIDTH = 1200\n", "HERO_HEIGHT = 700\n", - "HERO_PADDING = (116, 168, 76, 148)\n", + "HERO_PADDING = (24, 144, 24, 64)\n", "\n", "\n", "def project_longitude(value):\n", @@ -167,53 +168,36 @@ "\n", "def nyc_x_axis(*, compact=False):\n", " return xy.x_axis(\n", - " label=None if compact else \"LONGITUDE / WEST\",\n", + " label=None,\n", " domain=MAP_X_DOMAIN,\n", " bounds=MAP_X_DOMAIN,\n", - " tick_values=None if compact else MAP_X_TICKS,\n", - " tick_labels=None if compact else MAP_X_LABELS,\n", - " tick_label_strategy=\"none\" if compact else None,\n", + " tick_label_strategy=\"none\",\n", " style={\n", - " \"grid_color\": \"#193743\",\n", - " \"grid_width\": 1,\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.72,\n", - " \"axis_color\": \"#496979\",\n", + " \"grid_opacity\": 0,\n", + " \"axis_color\": \"#00b8db66\",\n", " \"axis_width\": 1,\n", - " \"tick_color\": \"#e6b969\",\n", - " \"tick_width\": 1,\n", - " \"tick_length\": 4,\n", - " \"tick_label_color\": \"#b9cbd0\",\n", - " \"label_color\": \"#f3d59a\",\n", - " \"tick_label_size\": 11,\n", - " \"label_size\": 12,\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", " },\n", " )\n", "\n", "\n", "def nyc_y_axis(*, compact=False):\n", " return xy.y_axis(\n", - " label=None if compact else \"LATITUDE / NORTH\",\n", - " label_offset=-18,\n", + " label=None,\n", " domain=MAP_Y_DOMAIN,\n", " bounds=MAP_Y_DOMAIN,\n", - " tick_values=None if compact else MAP_Y_TICKS,\n", - " tick_labels=None if compact else MAP_Y_LABELS,\n", - " tick_label_strategy=\"none\" if compact else None,\n", + " tick_label_strategy=\"none\",\n", " style={\n", - " \"grid_color\": \"#193743\",\n", - " \"grid_width\": 1,\n", - " \"grid_dash\": \"dotted\",\n", - " \"grid_opacity\": 0.72,\n", - " \"axis_color\": \"#496979\",\n", - " \"axis_width\": 1,\n", - " \"tick_color\": \"#e6b969\",\n", - " \"tick_width\": 1,\n", - " \"tick_length\": 4,\n", - " \"tick_label_color\": \"#b9cbd0\",\n", - " \"label_color\": \"#f3d59a\",\n", - " \"tick_label_size\": 11,\n", - " \"label_size\": 12,\n", + " \"grid_opacity\": 0,\n", + " \"axis_color\": \"#00000000\",\n", + " \"axis_width\": 0,\n", + " \"tick_color\": \"#00000000\",\n", + " \"tick_width\": 0,\n", + " \"tick_label_color\": \"#00000000\",\n", + " \"label_color\": \"#00000000\",\n", " },\n", " )\n", "\n", @@ -221,10 +205,10 @@ "def nyc_theme():\n", " return xy.theme(\n", " background=\"#08131b\",\n", - " plot_background=\"#071821\",\n", + " plot_background=\"#08131b\",\n", " text_color=\"#edf1e8\",\n", - " grid_color=\"#193743\",\n", - " axis_color=\"#496979\",\n", + " grid_color=\"#00000000\",\n", + " axis_color=\"#00b8db66\",\n", " crosshair_color=\"#ffca68\",\n", " selection_color=\"#ffb000\",\n", " selection_fill=\"#ffb00024\",\n", @@ -283,40 +267,6 @@ " )\n", "\n", "\n", - "def nyc_header(mode):\n", - " header_anchor_y = 1 - (HERO_PADDING[0] - 16) / HERO_HEIGHT\n", - " return (\n", - " xy.text(\n", - " HERO_PADDING[3] / HERO_WIDTH,\n", - " header_anchor_y,\n", - " \"NYC NIGHT MOVES\",\n", - " dx=0,\n", - " dy=-56,\n", - " color=\"#fff7e3\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 26,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.025em\",\n", - " },\n", - " ),\n", - " xy.text(\n", - " HERO_PADDING[3] / HERO_WIDTH,\n", - " header_anchor_y,\n", - " f\"{longitude.size:,} PICKUPS · YELLOW CAB 2015 · {mode}\",\n", - " dx=0,\n", - " dy=-12,\n", - " color=\"#7fa8b2\",\n", - " style={\n", - " \"coordinate_space\": \"figure_fraction\",\n", - " \"font_size\": 10,\n", - " \"font_weight\": 700,\n", - " \"letter_spacing\": \"0.09em\",\n", - " },\n", - " ),\n", - " )\n", - "\n", - "\n", "NYC_CHROME_STYLES = {\n", " \"title\": {\n", " \"text_align\": \"left\",\n", @@ -335,13 +285,13 @@ " },\n", " \"colorbar\": {\n", " \"background\": \"#0d202a\",\n", - " \"color\": \"#f3d59a\",\n", + " \"color\": \"#d9e8e6\",\n", " \"border\": \"1px solid #294652\",\n", " \"border_radius\": 5,\n", - " \"padding\": \"8px 7px\",\n", + " \"padding\": \"6px 5px\",\n", " },\n", - " \"colorbar_title\": {\"font_size\": 11, \"font_weight\": 700, \"letter_spacing\": \"0.055em\"},\n", - " \"colorbar_tick\": {\"font_size\": 11},\n", + " \"colorbar_title\": {\"font_size\": 10, \"font_weight\": 700, \"letter_spacing\": \"0.045em\"},\n", + " \"colorbar_tick\": {\"font_size\": 10},\n", " \"tooltip\": {\n", " \"background\": \"#0d202a\",\n", " \"color\": \"#edf1e8\",\n", @@ -371,7 +321,6 @@ " density=False,\n", " ),\n", " *nyc_landmarks(),\n", - " *nyc_header(\"ALL-HOUR · ADAPTIVE SCATTER DENSITY\"),\n", " nyc_x_axis(),\n", " nyc_y_axis(),\n", " xy.tooltip(title=\"YELLOW-TAXI PICKUP\"),\n", @@ -380,7 +329,6 @@ " nyc_theme(),\n", " styles=NYC_CHROME_STYLES,\n", " style={\n", - " \"border\": \"1px solid #294652\",\n", " \"font_family\": \"Avenir Next, ui-sans-serif, sans-serif\",\n", " },\n", " width=HERO_WIDTH,\n", @@ -409,16 +357,15 @@ " gridsize=(210, 260),\n", " mincnt=2,\n", " bins=\"log\",\n", - " colormap=\"magma\",\n", + " colormap=\"viridis\",\n", " opacity=0.96,\n", " ),\n", " *nyc_landmarks(),\n", - " *nyc_header(\"ALL-HOUR · LN-SCALED HEX DENSITY\"),\n", " nyc_x_axis(),\n", " nyc_y_axis(),\n", " xy.colorbar(\n", " title=\"LN(1 + PICKUPS / HEX)\",\n", - " ticks=[2, 3, 4, 5, 6, 7],\n", + " ticks=[2, 4, 6, 7],\n", " orientation=\"vertical\",\n", " ),\n", " xy.tooltip(title=\"LN(1 + PICKUPS / HEX)\", format={\"value\": \".2f\"}),\n", @@ -427,7 +374,6 @@ " nyc_theme(),\n", " styles=NYC_CHROME_STYLES,\n", " style={\n", - " \"border\": \"1px solid #294652\",\n", " \"font_family\": \"Avenir Next, ui-sans-serif, sans-serif\",\n", " },\n", " width=HERO_WIDTH,\n", diff --git a/examples/real_world/assets/01-gaia-hr-diagram.png b/examples/real_world/assets/01-gaia-hr-diagram.png index f26adcbb..5cb5e8a3 100644 Binary files a/examples/real_world/assets/01-gaia-hr-diagram.png and b/examples/real_world/assets/01-gaia-hr-diagram.png differ diff --git a/examples/real_world/assets/02-gnomad-allele-frequency.png b/examples/real_world/assets/02-gnomad-allele-frequency.png index 3d4a20a7..a1a90fec 100644 Binary files a/examples/real_world/assets/02-gnomad-allele-frequency.png and b/examples/real_world/assets/02-gnomad-allele-frequency.png differ diff --git a/examples/real_world/assets/03-pan-ukbb-manhattan.png b/examples/real_world/assets/03-pan-ukbb-manhattan.png index 964a8f49..5a8a53a7 100644 Binary files a/examples/real_world/assets/03-pan-ukbb-manhattan.png and b/examples/real_world/assets/03-pan-ukbb-manhattan.png differ diff --git a/examples/real_world/assets/04-dukascopy-fx-ticks.png b/examples/real_world/assets/04-dukascopy-fx-ticks.png index fd939990..7f0c2c6e 100644 Binary files a/examples/real_world/assets/04-dukascopy-fx-ticks.png and b/examples/real_world/assets/04-dukascopy-fx-ticks.png differ diff --git a/examples/real_world/assets/05-ligo-gw150914-strain.png b/examples/real_world/assets/05-ligo-gw150914-strain.png index f2dba1ba..8b3a0d77 100644 Binary files a/examples/real_world/assets/05-ligo-gw150914-strain.png and b/examples/real_world/assets/05-ligo-gw150914-strain.png differ diff --git a/examples/real_world/assets/06-nyc-taxi-density.png b/examples/real_world/assets/06-nyc-taxi-density.png index 51c8aed9..deafb589 100644 Binary files a/examples/real_world/assets/06-nyc-taxi-density.png and b/examples/real_world/assets/06-nyc-taxi-density.png differ