Grammar of Scalable Linked Interactive Nucleotide Graphics

Overview

Gosling.js

npm version build status codecov code style: prettier online editor docs

Gosling.js is a declarative grammar for interactive (epi)genomics visualization on the Web.

teaser

⚠️ Please be aware that the grammar of Gosling.js may change to some extent before the first official release.

Why Gosling?

The Gosling's key features compared to existing visualization libraries and grammars are as follows:

  • Encoding/Data Scalability: Gosling scales from whole genomes to single nucleotides via semantic zooming that updates visual encodings dynamically and by using the rendering and data access capabilities of our HiGlass genomics visualization framework.

  • Expressiveness: Gosling is designed to be expressive enough to generate pretty much any visualization of genome-mapped data, which we accomplished by basing the grammar on our taxonomy of (epi)genomics data visualizations.

  • Interactivity: Gosling has intuitive and effective user interactions built in, including zooming and panning and brushing and linking. This enables flexible visualizations that cover a wide range of visual analysis scenarios, like overview + detail views with brushes or comparative views.

Learn More About Gosling

Contributing to Gosling.js

We welcome and greatly appreciate your contribution to this project! Please read CONTRIBUTING.md to find guidelines.

Contact

Team

Citation

L'Yi et al., 2021. “Gosling: A Grammar-based Toolkit for Scalable and Interactive Genomics Data Visualization.”

@article{lyi2021gosling,
  title={Gosling: A Grammar-based Toolkit for Scalable and Interactive Genomics Data Visualization},
  author={Sehi L'Yi and Qianwen Wang and Fritz Lekschas and Nils Gehlenborg},
  year={2021},
  journal={IEEE Transactions on Visualization and Computer Graphics},
  publisher={IEEE},
  doi={10.1109/TVCG.2021.3114876},
}

License

This project is licensed under the terms of the MIT license.

Comments
  • feat(editor): support javascript editor

    feat(editor): support javascript editor

    image

    Supporting a javascript editor enables:

    • more structured and easy-to-read code, especially for multi-view visualizations
    • comments & annotations in the code example
    opened by wangqianwen0418 14
  • Grammars about the responsive design

    Grammars about the responsive design

    @sehilyi, I am planning to update docs about the responsive design. Going through the responsive examples, I have some thoughts and questions and would like to hear your opinions.

    • I am wondering whether we can specify the conditions using a more unified expression, e.g., something like alt.condtion in altair. Instead of specifying a spec at two different places,
          "layout": "circular",
          "responsiveSpec": [
            {
              "spec": {"layout": "linear"},
              "selectivity": [
                {"measure": "aspectRatio", "operation": "GT", "threshold": 1.5}
              ]
            }
          ],
    

    maybe we can use something like (assuming now the type layout = string|condition)

      "layout": {
        "ifTrue": "linear", 
        "ifFalse": "circular",
        "condition":  {"measure": "aspectRatio", "operation": "GT", "threshold": 1.5}
      }
    
    • the same goes for the responsiveSize. instead of specifying it at two places
    "responsiveSize": {"width": true},
     "width": 400,
    

    do you think it will be more convenient to write the below?

    "width": {
      "ifTrue": 400,
      "ifFalse": "vw", // not sure what is the best way to express the screen size here
      "condition": {"measure": "width", "operation": "GT", "threshold": 1000}
    }
    

    or just "width": "vw" if the width is always the width of the screen.

    This definition is also consistent with the type definition of the visibility object, by considering the default value as "ifTrue": "visible", "ifFalse": "invisible".

    • In a circular layout, the height of a track has no meaning in terms of the number of pixels. Will it be confusing if a user wants a circular chart to respond to the change of (screen) height? What is the proper way to define that?
    enhancement 
    opened by wangqianwen0418 13
  • feat: replace webpack/webpack-dev-server with vite

    feat: replace webpack/webpack-dev-server with vite

    Builds off of #494, but replaces the webpack-dev-server/build with vite. I think ideally we could just use Vite to unify the build, but the build.js script gives us better control over the "package".

    opened by manzt 11
  • feat: replace jest with vitest

    feat: replace jest with vitest

    Vitest is a unit-testing framework that is intended to be a drop-in replacement for Jest. The main benefit is that is reuses Vite's config, transformers, resolvers, and plugins. This means that the testing environment more closely mimics the final build, and we no longer need to worry about making things work in Jest and our build.

    opened by manzt 8
  • feat!: merge axis channels (e.g., `x` and `xe`); group channels as an `encoding` property

    feat!: merge axis channels (e.g., `x` and `xe`); group channels as an `encoding` property

    Fix #506 Fix #482

    Summary of Changes

    In addition to #533, this PR changes grammar around visual channels.

    This PR contains a relatively large amount of changes, but many parts are changes on the examples (src/example/*.ts) and tests (*.test.ts) reflecting the grammatical changes that have been introduced in this PR. This PR introduces the following major grammatical changes.

    C1. Axis channels are combined

    from:

    x: { field: 'start', type: 'genomic', axis: 'top', linkingId: 'overview' },
    xe: { field: 'end', type: 'genomic', axis: 'top' }
    

    to:

    x: { startField: 'start', endField: 'end', type: 'genomic', axis: 'top', linkingId: 'overview' }
    

    This way, axis channels convey a more clear meaning:

    • multiple axes do not exist for the x-axis (i.e., x and xe) or the y-axis (i.e., y and ye).
    • Instead, multiple fields can be used for a single axis (i.e., startField and endField in an x channel).

    More importantly, this prevents users from making uncertain specs, such as

    • using different types for the single axis (e.g., nominal field for y and then quantitative field for ye)
    • defining properties multiple times for a single axis that should be defined only once (e.g., axis: 'top' or linkingId: 'overview'):
    x: { field: 'start', type: 'genomic', axis: 'top', linkingId: 'overview' },
    xe: { field: 'end', type: 'genomic', axis: 'bottom', linkingId: 'ab' }
    

    C2. The encoding property is added

    Track now has a encoding property that wraps all channels:

    tracks: [{
       mark: 'line',
       encoding: {
          x: { startField: 'start', endField: 'end', type: 'genomic', axis: 'top', linkingId: 'overview' },
          color: { value: 'black' }
       },
       width: 100,
       height: 30
    }]
    

    This is consistent with the Vega-Lite and is beneficial in gos (https://github.com/gosling-lang/gos/issues/34#issuecomment-904798525).

    C3. TemplateTrack modified accordingly

    As we made a grammatical change to channels (i.e., x and xe --> x: { startField: ...., endField: ..., ...}), the template mapper logic was changed as well:

    // part of a TemplateTrackDef spec
    x: { base: { startField: 'startPosition', endField: 'endPosition', ... }
    

    C4. DataTrack is removed entirely

    We did not support DataTrack anymore, but it was still included in our code. I removed all related codes. We could support a similar feature with Track Templates in Gosling in the future:

    { template: 'vector-track', data: { ... }, width: 1000, height: 30}
    

    To Test Locally

    Run the following command to update your local gosling.schema.json since this PR updates the grammar.

    yarn schema
    

    BREAKING CHANGE

    This PR introduces breaking changes. To change your existing specification for previous versions (~v0.9.9), you need to change your spec following the instructions described below.

    If you are using multiple fields for a single axis in your spec:

    x: { field: 'start', type: 'genomic', axis: 'top', linkingId: 'overview' },
    xe: { field: 'end', type: 'genomic', axis: 'top' }
    

    You need to combine them to a single axis using up to four fields (i.e., startField, endField, startField2, endField2):

    x: { startField: 'start', endField: 'end', type: 'genomic', axis: 'top', linkingId: 'overview' }
    

    Single-field axes are not changed (i.e., field properties are used):

    x: { field: 'position', type: 'genomic', axis: 'top', linkingId: 'overview' }
    

    Add an encoding property to all tracks.

    From:

    tracks: [{
       data: ...,
       mark: ...,
       x: ...,
       y: ...,
       ...
    }]
    

    To:

    tracks: [{
       data: ...,
       mark: ...,
       encoding: {
          x: ...,
          y: ...,
          ...
       },
       ...
    }]
    

    TODO

    • [x] Update all example specs that use multiple fields for a single axis
    • [x] Update encoding parts of all marks
    • [x] Update all tests
    • [ ] Rename '|xe - x|' threshold to 'assignedWidth'?
    opened by sehilyi 8
  • zoomToGene doesn't work as expected

    zoomToGene doesn't work as expected

    There are 3 views in the following spec: 1) ideogram, 2) CN point plot, 3) gene annotation. The views are linked using the same linkingId. zoomToGene jumps to a specific gene, the first views go to the right region, but the last one keeps intact.

    I built a search bar for jumping to any region. How can I use higlass auto-completion to get gene suggestion and then go to the corresponding location?

    export const getOverviewSpec = (hoveredGene, hotGenes, enabled) => {
      return {
        "arrangement": "vertical",
        "title": "Large Rearrangment Auditing",
        "assembly": "hg19",
        "spacing": 0,
        "views": [
          {
            //"xDomain": { "chromosome": "1" },
            "linkingId": "mychoics_plus",
            "width": 1000,
            "height": 20, // reduce the track height
            "data": {
              "url": "https://dataviz.brbiotech.com/shared/cytoBand.hg19.tsv",
              "type": "csv",
              "separator": "\t",
              "chromosomeField": "chrom",
              "genomicFields": ["chromStart", "chromEnd"]
            },
            "x": {
              "field": "chromStart",
              "type": "genomic",
              "axis": "none"
            },
            "xe": { "field": "chromEnd", "type": "genomic" },
            "alignment": "overlay",
            "tracks": [
              {
                id: "ov-track-1",
                "mark": "text",
                "dataTransform": [{ "type": "filter", "field": "gieStain", "oneOf": ["acen"], "not": true }],
                "text": { "field": "name", "type": "nominal" },
                "color": {
                  "field": "gieStain",
                  "type": "nominal",
                  "domain": ["gneg", "gpos25", "gpos50", "gpos75", "gpos100", "gvar"],
                  "range": ["black", "black", "black", "black", "white", "black"]
                },
                "visibility": [
                  {
                    "operation": "less-than",
                    "measure": "width",
                    "threshold": "|xe-x|",
                    "transitionPadding": 10,
                    "target": "mark"
                  }
                ],
                "style": { "textStrokeWidth": 0 }
              },
              {
                id: "ov-track-2",
                "mark": "rect",
                "dataTransform": [{ "type": "filter", "field": "gieStain", "oneOf": ["acen"], "not": true }],
                "color": {
                  "field": "gieStain",
                  "type": "nominal",
                  "domain": ["gneg", "gpos25", "gpos50", "gpos75", "gpos100", "gvar"],
                  "range": [
                    "white",
                    "#D9D9D9",
                    "#979797",
                    "#636363",
                    "black",
                    "#A0A0F2"
                  ]
                }
              },
              {
                id: "ov-track-3",
                "mark": "triangleRight",
                "dataTransform": [
                  { "type": "filter", "field": "gieStain", "oneOf": ["acen"] },
                  { "type": "filter", "field": "name", "include": "q" }
                ],
                "color": { "value": "#B40101" }
              },
              {
                id: "ov-track-4",
                "mark": "triangleLeft",
                "dataTransform": [
                  { "type": "filter", "field": "gieStain", "oneOf": ["acen"] },
                  { "type": "filter", "field": "name", "include": "p" }
                ],
                "color": { "value": "#B40101" }
              }
            ],
            "size": { "value": 20 },
            "stroke": { "value": "gray" },
            "strokeWidth": { "value": 0.5 }
          },
          {
            alignment: "overlay",
            "linkingId": "mychoics_plus",
            genomePositionSearchBox: {
                autocompleteServer: 'https://higlass.io/api/v1',
                autocompleteId: 'P0PLbQMwTYGy-5uPIQid7A',
                chromInfoServer: 'https://higlass.io/api/v1',
                chromInfoId: 'hg19'
            },
    				data: {
    					url: "https://dataviz.brbiotech.com/RS20210907013FFP.panelData.tsv",
    					type: "csv",
    					separator: "\t",
    					sampleLength: 10000,
    					chromosomeField: "chr",
    					genomicFields: ["uniProbeStart"],
    					quantitativeFields: ["CN"]
    				},
            mark: "point",
            x: { field: "uniProbeStart", type: "genomic" },
            y: { field: "CN", type: "quantitative" },
            size: { value: 4 },
            tooltip: [
              { field: "chr", type: "nominal", alt: "Chromosome" },
              { field: "uniProbeStart", type: "genomic", alt: "Position" },
              { field: "gene", type: "nominal", alt: "Gene" },
            ],
            opacity: { value: 0.5 },
            tracks: [
              {
                id: "ov-track-5",
                color: { value: "#C7D2FE" },
                //overlayOnPreviousTrack: true,
              },
              { 
                "id": "ov-track-6",
                dataTransform: [
                  { type: 'filter', field: 'gene', oneOf: [hoveredGene] }
                ],
                "color": { "value": "#6366F1" },
                //overlayOnPreviousTrack: true,
              },
              {
                id: "ov-track-6-2",
                dataTransform: [
                  { type: 'filter', field: 'gene', oneOf: hotGenes }
                ],
                "color": {
                  "field": "gene",
                  "type": "nominal",
                  legend: true,
                  "domain": hotGenes,
                },
                //overlayOnPreviousTrack: true,
              }
            ],
            style: { inlineLegend: true },
            width: 1000,
            height: 400
          },
          {
            "alignment": "overlay",
            "title": "hg19 | Genes",
            "linkingId": "mychoics_plus",
            //"xDomain": { "chromosome": "1" },
            "data": {
              "url": "https://higlass.io/api/v1/tileset_info/?d=OHJakQICQD6gTD7skx4EWA",
              "type": "beddb",
              "genomicFields": [
                {"index": 1, "name": "start"},
                {"index": 2, "name": "end"}
              ],
              "valueFields": [
                {"index": 5, "name": "strand", "type": "nominal"},
                {"index": 3, "name": "name", "type": "nominal"}
              ],
              "exonIntervalFields": [
                {"index": 12, "name": "start"},
                {"index": 13, "name": "end"}
              ]
            },
            "tracks": [
              {
                id: "ov-track-8",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]}
                ],
                "mark": "text",
                "text": {"field": "name", "type": "nominal"},
                "x": {"field": "start", "type": "genomic"},
                "xe": {"field": "end", "type": "genomic"},
                "style": {"dy": -15, "outline": "black", "outlineWidth": 0}
              },
              {
                id: "ov-track-7",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["+"]}
                ],
                "mark": "triangleRight",
                "x": {"field": "end", "type": "genomic", "axis": "none"},
                "size": {"value": 15}
              },
              {
                id: "ov-track-9",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["-"]}
                ],
                "mark": "triangleLeft",
                "x": {"field": "start", "type": "genomic"},
                "size": {"value": 15},
                "style": {
                  "align": "right",
                  "outline": "black",
                  "outlineWidth": 0
                }
              },
              {
                id: "ov-track-10",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["exon"]}
                ],
                "mark": "rect",
                "x": {"field": "start", "type": "genomic"},
                "size": {"value": 15},
                "xe": {"field": "end", "type": "genomic"}
              },
              {
                id: "ov-track-11",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["+"]}
                ],
                "mark": "rule",
                "x": {"field": "start", "type": "genomic"},
                "strokeWidth": {"value": 2},
                "xe": {"field": "end", "type": "genomic"},
                "style": {
                  "linePattern": {"type": "triangleRight", "size": 3.5},
                  "outline": "black",
                  "outlineWidth": 0
                }
              },
              {
                id: "ov-track-12",
                "dataTransform": [
                  {"type": "filter", "field": "type", "oneOf": ["gene"]},
                  {"type": "filter", "field": "strand", "oneOf": ["-"]}
                ],
                "mark": "rule",
                "x": {"field": "start", "type": "genomic"},
                "strokeWidth": {"value": 2},
                "xe": {"field": "end", "type": "genomic"},
                "style": {
                  "linePattern": {"type": "triangleLeft", "size": 3.5},
                  "outline": "black",
                  "outlineWidth": 0
                }
              }
            ],
            "row": {
              "field": "strand",
              "type": "nominal",
              "domain": ["+", "-"]
            },
            "color": {
              "field": "strand",
              "type": "nominal",
              "domain": ["+", "-"],
            },
            "visibility": [
              {
                "operation": "less-than",
                "measure": "width",
                "threshold": "|xe-x|",
                "transitionPadding": 10,
                "target": "mark"
              }
            ],
            "width": 1000,
            "height": 100
          },
        ]
      };
    };
    
    
    bug🐛 documentation 
    opened by zhangzhen 8
  • feat: support native matrix visualization

    feat: support native matrix visualization

    This PR adds native support of matrix data. Example of drawing matrix using matrix format data:

    {
         data: {
              url: GOSLING_PUBLIC_DATA.matrixMicroC,
              type: 'matrix'
          },
          mark: 'bar',
          x: { field: 'xs', type: 'genomic', axis: 'none' },
          xe: { field: 'xe', type: 'genomic', axis: 'none' },
          y: { field: 'ys', type: 'genomic', axis: 'none' },
          ye: { field: 'ye', type: 'genomic', axis: 'none' },
          color: { field: 'value', type: 'quantitative', range: 'warm' },
          width: 600,
          height: 600
    }
    

    Screenshots

    Screen Shot 2021-12-16 at 5 48 01 PM

    https://user-images.githubusercontent.com/9922882/146459349-a7f10f91-2476-40f6-8f3e-e99b488946bc.mov

    There are multiple follow up things to do:

    • [ ] Axis on 2D tracks seem to be broken. This needs to be fixed.
    • [ ] Improving the rendering performance. Zooming is slow with dense Hi-C data.
    • [ ] Supporting log scale color (e.g., color: { ..., scale: 'log' })
    • [ ] Supporting horizontal rules. Currently, we support vertical rules (see the MATRIX example).
    • [ ] Somehow, the right-top part along the diagonal is zero values. Need to confirm if data itself only contains the left-bottom part to reduce performance. In this case, we need to properly manipulate data when loaded.
    opened by sehilyi 7
  • Support custom chromsizes

    Support custom chromsizes

    Adding a custom-defined genome is easy for higlass, while doing this is hard for gosling. Could you please guide me in modifying the source code for gosling to achieve this? After finishing the modification, zooming, panning and zoom_to are expected to function correctly. Besides, sequence abstraction can be easily implemented by add a custom-defined genome to gosling.

    enhancement P5 D? 
    opened by zhangzhen 6
  • Axis w/o

    Axis w/o "chr"?

    Hi,

    I'm playing around with using gosling to display information w/o a chromosome (a random contig and annotations), and was wondering if it's possible to remove the "chrN: " from the axis? e.g.

    image

    Thanks!

    enhancement question 
    opened by tshauck 6
  • More concise (text-based) columnar data definitions

    More concise (text-based) columnar data definitions

    Apologies for the lack on context behind the choice, but I don't know if I understand the motivation for including quantitativeFields, genomicFields, and chromosomeField in the CSV data definition. These fields aren't marked as required in the docs, but every example I've seen includes their use.

    Motivation

    To my knowledge, these columns inform how the CSV is parsed but this interpretation is also captured elsewhere in the track definition (type: genomic, quantitative, categorical, etc), so really it's an abstraction leak. I see how the chromosomeField is currently necessary, but I'm curious if that information could also be captured in the "genomic" type rather than the data definition.

    As a motivating example, what is the expected behavior if I use a field type that differs from the data definition? I assume the track type takes precedent, and if so we don't need the data definition since a type is required on all tracks.

    import gosling as gos
    
    data = gos.csv('./data.csv', genomicFields=['start', 'end'], chromosomeField='chr', quantitativeFields=['value'])
    
    gos.Track(data).encode(x=gos.Channel('start:G'), y=gos.Channel('value:N')) # value doesn't match data definition
    

    Proposal

    Remove quantitativeFields, genomicFields, and maybe chromosomeField from CSV definition. This would make specifying CSV data more concise and avoid the case where data definition does not match track definition.

    import gosling as gos
    import pandas as pd
    
    data = gos.csv('./data.csv')
    data = pd.read_csv('./data.csv').gos.csv() # no arguments needed
    

    Approach

    Use build-in (d3?) auto-parsing of CSV into memory. We can coerce any data-types that are mis-interpreted based on the track definition. Perhaps as an extension to #575, we can think about if there is a way to include chromosome field in the X encoding definition.

    interface X {
      type: 'genomic';
      // tuples represent chromosome position OR chromosome region
      field: [chrom: string, start: string] | [chrom: string, start: string, end: string];
      // ...
    }
    
    documentation enhancement 
    opened by manzt 5
  • feat: more precise channel types (e.g., `X`, `Y`, and `Color` instead of `Channel`)

    feat: more precise channel types (e.g., `X`, `Y`, and `Color` instead of `Channel`)

    This PR uses more precise types of individual channels, like X, Y, and Color. This allows checking gosling.js specs more precisely, e.g., row cannot be encoded with a genomic field:

    row: { ..., type: "genomic" } // Error
    

    or x is always mapped to a genomic field:

    x: { ..., type: "quantitative" } // Error
    

    Genomic domain is used for only x-axis channels:

    y: { ..., domain: { chromosome: '1' } } // Error
    

    Towards #506

    opened by sehilyi 5
  • chore(deps): bump json5 from 1.0.1 to 1.0.2

    chore(deps): bump json5 from 1.0.1 to 1.0.2

    Bumps json5 from 1.0.1 to 1.0.2.

    Release notes

    Sourced from json5's releases.

    v1.0.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295). This has been backported to v1. (#298)
    Changelog

    Sourced from json5's changelog.

    Unreleased [code, diff]

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0 [code, diff]

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2 [code, diff]

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump decode-uri-component from 0.2.0 to 0.2.2

    chore(deps): bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump qs from 6.10.1 to 6.11.0

    chore(deps): bump qs from 6.10.1 to 6.11.0

    Bumps qs from 6.10.1 to 6.11.0.

    Changelog

    Sourced from qs's changelog.

    6.11.0

    • [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option (#442)
    • [readme] fix version badge

    6.10.5

    • [Fix] stringify: with arrayFormat: comma, properly include an explicit [] on a single-item array (#434)

    6.10.4

    • [Fix] stringify: with arrayFormat: comma, include an explicit [] on a single-item array (#441)
    • [meta] use npmignore to autogenerate an npmignore file
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, object-inspect, tape

    6.10.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [actions] reuse common workflows
    • [Dev Deps] update eslint, @ljharb/eslint-config, object-inspect, tape

    6.10.2

    • [Fix] stringify: actually fix cyclic references (#426)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [actions] update codecov uploader
    • [actions] update workflows
    • [Tests] clean up stringify tests slightly
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, object-inspect, safe-publish-latest, tape
    Commits
    • 56763c1 v6.11.0
    • ddd3e29 [readme] fix version badge
    • c313472 [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option
    • 95bc018 v6.10.5
    • 0e903c0 [Fix] stringify: with arrayFormat: comma, properly include an explicit `[...
    • ba9703c v6.10.4
    • 4e44019 [Fix] stringify: with arrayFormat: comma, include an explicit [] on a s...
    • 113b990 [Dev Deps] update object-inspect
    • c77f38f [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, tape
    • 2cf45b2 [meta] use npmignore to autogenerate an npmignore file
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • gos.overlay Fails when

    gos.overlay Fails when "background" parameter is filled in.

    Here is a screenshot:

    image

    When the "background" parameter is set in mark_line(), the gos.overlay() does not overlay the marks inside "tracks". Instead it does a simple line graph using the LAST gosling track inside "tracks"

    Using streamlit, the output looks like this. image

    When I remove the "background parameter from mark_line() as such:

    image

    I get the intended display. However, if I want the background to be anything other than white I cannot.

    image

    bug🐛 P5 
    opened by AlexAdrian-Hamazaki 1
  • Ability to label Vertically Aligned views or Track Stacks

    Ability to label Vertically Aligned views or Track Stacks

    Hi, I am currently using the python implementation of gos. As far as I'm aware, I don't believe there is an option to "label" a set of vertical views, or a several vertically stacked tracks. Please correct me if I'm wrong!

    This could be a potentially important feature in the future.

    enhancement 
    opened by AlexAdrian-Hamazaki 2
Releases(v0.9.28)
Owner
Gosling
The data visualization grammar of scalable linked interactive nucleotide graphics. A project of the Gehlenborg Lab at @hms-dbmi.
Gosling
Adam with minor modifications which give significant improvement

BAdam Modification of Adam [1] optimizer with increased stability and better performance. Tricks used: Decoupled weight decay as in AdamW [2]. Such de

19 May 11, 2022
Ellipitical Curve Table Generator

Ellipitical-Curve-Table-Generator This script generates a table of elliptical po

Nishaant Goswamy 1 Jan 02, 2022
TeamFleming is a multicultural group of 20 young bioinformatics enthusiasts participating in the 2021 HackBio Virtual Summer Internship

💻 Welcome to Team Fleming's Repo! #TeamFleming is a multicultural group of 20 young bioinformatics enthusiasts participating in the 2021 HackBio Virt

3 Aug 08, 2021
Usando Multi Player Perceptron e Regressão Logistica para classificação de SPAM

Relatório dos procedimentos executados e resultados obtidos. Objetivos Treinar um modelo para classificação de SPAM usando o dataset train_data. Class

André Mediote 1 Feb 02, 2022
Polypheny Connector for Python

Polypheny Connector for Python This enables Python programs to access Polypheny databases, using an API that is compliant with the Python Database API

Polypheny 3 Jan 03, 2022
Algo próximo do ARP

ArpPY Algo parecido com o ARP-Scan. Dependencias O script necessita no mínimo ter o Python versão 3.x instalado e ter o sockets instalado. Executando

Feh's 3 Jan 18, 2022
A Way to Use Python, Easier.

PyTools A Way to Use Python, Easier. How to Install Just copy this code, then make a new file in your project directory called PyTools.py, then paste

Kamran 2 Aug 15, 2022
Cairo hooks for pre-commit

pre-commit-cairo Cairo hooks for pre-commit. See pre-commit for more details Using pre-commit-cairo with pre-commit Add this to your .pre-commit-confi

Fran Algaba 16 Sep 21, 2022
ESteg - A simple steganography program for python

ESteg A simple steganography program to embed the contents of a text file into a

Jithin Renji 1 Jan 02, 2022
[Cython] Vs [Python] Which one is Faster ?

[Cython] Vs [Python] ? Attractive Contrast :) Mission : Which one is Faster ? Comparing of Execution runtime for [Selection_sort] with Time Complexity

baqer marani 1 Dec 05, 2021
An app about keyboards, originating from the design of u/Sonnenschirm

keebapp-backend An app about keyboards, originating from the design of u/Sonnenschirm Setup Firstly, ensure that the environment for python is install

8 Sep 04, 2022
Whatsapp Messenger master

Whatsapp Messenger master

Swarup Kharul 5 Nov 21, 2021
Traits for Python3

Do you like Python, but think that multiple inheritance is a bit too flexible? Are you looking for a more constrained way to define interfaces and re-use code?

121 Nov 15, 2022
Sorter makes file organisation and management easier.

Sorter Sorter makes file organisation easier. It simply helps you organise several files that contain similar characteristics into a single folder. Yo

Aswa Paul 34 Aug 14, 2022
This repository contains a lot of short scripting programs implemented both in Python (Flask) and TypeScript (NodeJS).

fast-scripts This repository contains a lot of short scripting programs implemented both in Python (Flask) and TypeScript (NodeJS). In python These wi

Nahum Maurice 3 Dec 10, 2022
CDM Device Checker for python

CDM Device Checker for python

zackmark29 79 Dec 14, 2022
Solve various integral equations using numerical methods in Python

Solve Volterra and Fredholm integral equations This Python package estimates Volterra and Fredholm integral equations using known techniques. Installa

Matthew Wildrick Thomas 18 Nov 28, 2022
Learning with Peter Norvig's lis.py interpreter

Learning with lis.py This repository contains variations of Peter Norvig's lis.py interpreter for a subset of Scheme, described in (How to Write a (Li

Fluent Python 170 Dec 15, 2022
Assignment for python course, BUPT 2021.

pyFuujinrokuDestiny Assignment for python course, BUPT 2021. Notice username and password must be ASCII encoding. If username exists in database, syst

Ellias Kiri Stuart 3 Jun 18, 2021
PIP VA TASHQI KUTUBXONALAR

39-dars PIP VA TASHQI KUTUBXONALAR KIRISH Avvalgi darsimizda Python bilan birga o'rnatluvchi, standart kutubxona va undagi ba'zi foydali modullar bila

Sayfiddin 3 Nov 25, 2021