tetrapoDNA
  • Visão geral
  • Espécies sem DNA
  • Por estado
  • Adote uma espécie
  • Fontes e método
Espécies sem DNA
cobertura_bruta = FileAttachment("data/cobertura.csv").csv({typed: true})
adocoes = FileAttachment("data/adocoes.csv").csv({typed: true})
status = FileAttachment("data/status.json").json()

REPO = "{{< meta website.repo-url >}}"

ROTULO_GRUPO = new Map([
  ["anfibios", "Anfíbios"], ["repteis", "Répteis"],
  ["aves", "Aves"], ["mamiferos", "Mamíferos"]
])
OPCOES_GRUPO = ["Todos", ...ROTULO_GRUPO.values()]
GRUPO_POR_ROTULO = new Map([...ROTULO_GRUPO].map(([k, v]) => [v, k]))

// Cores de situação (paleta de status: bom / atenção / crítico) e de grupo.
SITUACOES = ["com DNA", "a verificar", "sem DNA"]
COR_SITUACAO = ["#0ca30c", "#fab219", "#d03b3b"]
COR_GRUPO = ["#2a78d6", "#eb6834", "#1baf7a", "#eda100"]

AMEACADAS = new Set(["CR", "EN", "VU"])

cobertura = {
  const adot = new Map(adocoes.map(a => [a.especie, a]));
  return cobertura_bruta.map(d => {
    const a = adot.get(d.especie);
    const ufs = d.ufs ? String(d.ufs).split(";") : [];
    const cat = d.categoria_ameaca ?? "";
    return {
      ...d,
      grupo_rotulo: ROTULO_GRUPO.get(d.grupo),
      ufs_lista: ufs,
      endemica: d.endemica_br === true || d.endemica_br === "TRUE",
      ameacada: AMEACADAS.has(cat),
      adocao: a ? a.situacao : null,
      adotada_por: a ? a.instituicao : null,
      // prioridade: ameaçada > DD > endêmica > descrita há mais tempo
      prioridade: (AMEACADAS.has(cat) ? 0 : cat === "DD" ? 1 : 2) * 10 +
                  (d.endemica_br === true || d.endemica_br === "TRUE" ? 0 : 1)
    };
  });
}

filtra_grupo = (dados, rotulo) =>
  rotulo === "Todos" ? dados : dados.filter(d => d.grupo === GRUPO_POR_ROTULO.get(rotulo))

fmt = d3.format(",d")
fmtpct = d3.format(".0%")
fmtn = n => n == null ? "" : fmt(n).replace(/,/g, ".")

conta = dados => {
  const c = d3.rollup(dados, v => v.length, d => d.situacao);
  return {
    total: dados.length,
    com: c.get("com DNA") ?? 0,
    verificar: c.get("a verificar") ?? 0,
    sem: c.get("sem DNA") ?? 0
  };
}

link_adote = especie =>
  `${REPO}/issues/new?template=adote.yml&title=${encodeURIComponent("Adoção: " + especie)}&especie=${encodeURIComponent(especie)}`

selo_situacao = s => {
  const cls = s === "com DNA" ? "com" : s === "sem DNA" ? "sem" : "verificar";
  const ico = s === "com DNA" ? "✓" : s === "sem DNA" ? "✕" : "?";
  return htl.html`<span class="situacao ${cls}">${ico} ${s}</span>`;
}
filtradas = {
  const q = busca.trim().toLowerCase();
  return filtra_grupo(cobertura, grupo)
    .filter(d => situacoes.includes(d.situacao))
    .filter(d => uf === "Todas" || d.ufs_lista.includes(uf))
    .filter(d => familia === "Todas" || d.familia === familia)
    .filter(d => !extras.includes("só endêmicas do Brasil") || d.endemica)
    .filter(d => !extras.includes("só ameaçadas (CR, EN, VU)") || d.ameacada)
    .filter(d => !q || `${d.especie} ${d.familia} ${d.ordem}`.toLowerCase().includes(q))
    .sort((a, b) => d3.ascending(a.prioridade, b.prioridade) ||
                    d3.ascending(a.ano_descricao ?? 9999, b.ano_descricao ?? 9999) ||
                    d3.ascending(a.especie, b.especie));
}
Espécies
{
  const tab = Inputs.table(filtradas, {
    columns: ["especie", "adocao", "situacao", "grupo_rotulo", "familia", "ano_descricao",
              "categoria_ameaca", "endemica", "n_bold", "n_genbank", "ufs", "observacao"],
    header: {especie: "Espécie", situacao: "Situação", grupo_rotulo: "Grupo", familia: "Família",
             ano_descricao: "Descrita em", categoria_ameaca: "Ameaça", endemica: "Endêmica",
             n_bold: "BOLD", n_genbank: "GenBank", ufs: "UFs", observacao: "Observação",
             adocao: ""},
    format: {
      especie: d => htl.html`<em>${d}</em>`,
      situacao: selo_situacao,
      ano_descricao: d => d ? String(d) : "",
      endemica: d => d ? "sim" : "",
      n_bold: (d, i, dados) => htl.html`<a href="https://portal.boldsystems.org/result?query=${encodeURIComponent(dados[i].especie)}[tax]" target="_blank" title="Abrir no BOLD">${fmtn(d)}</a>`,
      n_genbank: (d, i, dados) => d == null ? "pendente" :
        htl.html`<a href="https://www.ncbi.nlm.nih.gov/nuccore/?term=${encodeURIComponent('"' + dados[i].especie + '"[Organism]')}" target="_blank" title="Abrir no GenBank">${fmtn(d)}</a>`,
      ufs: d => d ? String(d).replaceAll(";", " ") : "sem dado",
      observacao: d => htl.html`<span class="nota-pequena">${d ?? ""}</span>`,
      adocao: (d, i, dados) => d
        ? htl.html`<span class="selo">${d}</span>`
        : htl.html`<a class="btn-adote" href="${link_adote(dados[i].especie)}" target="_blank">adotar</a>`
    },
    width: {especie: 210, observacao: 380, ufs: 160},
    rows: 30, layout: "fixed", select: false
  });
  return htl.html`<div><p><strong>${fmtn(filtradas.length)}</strong> espécies com estes filtros.</p>${tab}</div>`;
}
viewof grupo = Inputs.select(OPCOES_GRUPO, {label: "Grupo", value: "Todos"})
viewof situacoes = Inputs.checkbox(SITUACOES, {label: "Situação", value: ["sem DNA", "a verificar"]})
viewof uf = Inputs.select(["Todas", "AC","AL","AP","AM","BA","CE","DF","ES","GO","MA","MT","MS","MG","PA","PB","PR","PE","PI","RJ","RN","RS","RO","RR","SC","SP","SE","TO"], {label: "Estado (UF)", value: "Todas"})
familias = ["Todas", ...Array.from(new Set(filtra_grupo(cobertura, grupo).map(d => d.familia))).sort()]
viewof familia = Inputs.select(familias, {label: "Família", value: "Todas"})
viewof extras = Inputs.checkbox(["só endêmicas do Brasil", "só ameaçadas (CR, EN, VU)"], {label: "Recorte"})
viewof busca = Inputs.text({label: "Buscar", placeholder: "gênero, espécie, família..."})
md`Ordenadas por prioridade: **ameaçadas** (CR, EN, VU) > **DD** > **endêmicas** > **descritas há mais tempo**.

Clique em **adotar** para abrir um pedido no GitHub: diga que vai sequenciar a espécie (de preferência a partir de tecido já depositado em coleção). Ver [Adote uma espécie](adote.html).

<span class="nota-pequena">Sem DNA = nenhuma sequência pública sob o nome da lista e os sinônimos conhecidos do CTFB. Não é prova de ausência: confira a coluna "Observação".</span>

[Baixar a tabela completa (CSV)](data/cobertura.csv)`

Dados: BOLD Systems, NCBI GenBank, CTFB/JBRJ e listas da SBH, CBRO e SBMz (ver Fontes).

 
  • Criar uma issue
  • Ver o código fonte

Código MIT · Dados CC-BY 4.0