{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0af88701-d9bc-47f2-8ceb-2ae51f567934",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Visualizar circuitos\"\n",
        "description: \"Crie visualizações de circuitos e trace dados de tarefas usando o módulo de visualização Qiskit\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore qcircuit mactex, backgroundcolor, lightgreen */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8d75dc24-b8d2-45f8-830b-48e45f794a31",
      "metadata": {},
      "source": [
        "<span id=\"visualize-circuits\" />\n",
        "\n",
        "# Visualizar circuitos\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7ea76afb-aecf-4ea2-b173-5d5e7e7d68ec",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Versões do pacote\">\n",
        "    O código desta página foi desenvolvido usando os seguintes requisitos.\n",
        "    Recomendamos o uso dessas versões ou de versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bd5865b3-adfa-4c87-be55-51f693335184",
      "metadata": {},
      "source": [
        "Muitas vezes é útil ver os circuitos que você está criando. Use as seguintes opções para exibir os circuitos do Qiskit.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "488c8d7d-5615-40ec-bf84-f1fa94832fce",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumCircuit"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8bbddcca-300c-4f20-98dd-a0723cdef026",
      "metadata": {},
      "source": [
        "<span id=\"draw-a-quantum-circuit\" />\n",
        "\n",
        "## Desenhe um circuito quântico\n",
        "\n",
        "A classe `QuantumCircuit` suporta o desenho de circuitos por meio do método `draw()` ou da impressão do objeto de circuito. Por padrão, ambos renderizam uma versão artística ASCII do diagrama de circuito.\n",
        "\n",
        "Observe que `print` retorna `None` , mas tem o efeito colateral de imprimir o diagrama, enquanto `QuantumCircuit.draw` retorna o diagrama sem efeitos colaterais. Como os notebooks Jupyter exibem a saída da última linha de cada célula, eles parecem ter o mesmo efeito.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "547f07e8-7891-433c-ac53-3186196b3aa7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build a quantum circuit\n",
        "circuit = QuantumCircuit(3, 3)\n",
        "circuit.x(1)\n",
        "circuit.h(range(3))\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure(range(3), range(3));"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "d69ae2df-c31c-414f-bba2-4c4a1012de41",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "     ┌───┐          ┌─┐   \n",
            "q_0: ┤ H ├───────■──┤M├───\n",
            "     ├───┤┌───┐┌─┴─┐└╥┘┌─┐\n",
            "q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├\n",
            "     ├───┤└┬─┬┘└───┘ ║ └╥┘\n",
            "q_2: ┤ H ├─┤M├───────╫──╫─\n",
            "     └───┘ └╥┘       ║  ║ \n",
            "c: 3/═══════╩════════╩══╩═\n",
            "            2        0  1 \n"
          ]
        }
      ],
      "source": [
        "print(circuit)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "04c91fd9-50a1-4ff3-84e4-0b51a6b1541a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "     ┌───┐          ┌─┐   \n",
              "q_0: ┤ H ├───────■──┤M├───\n",
              "     ├───┤┌───┐┌─┴─┐└╥┘┌─┐\n",
              "q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├\n",
              "     ├───┤└┬─┬┘└───┘ ║ └╥┘\n",
              "q_2: ┤ H ├─┤M├───────╫──╫─\n",
              "     └───┘ └╥┘       ║  ║ \n",
              "c: 3/═══════╩════════╩══╩═\n",
              "            2        0  1 "
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "circuit.draw()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2159af06-93b8-441d-b8aa-c29324d26c6e",
      "metadata": {},
      "source": [
        "<span id=\"alternative-renderers\" />\n",
        "\n",
        "### Renderizadores alternativos\n",
        "\n",
        "Uma saída de texto é útil para ver rapidamente a saída durante o desenvolvimento de um circuito, mas não oferece a maior flexibilidade. Há dois renderizadores de saída alternativos para o circuito quântico. Um usa [Matplotlib](https://matplotlib.org/) e o outro usa [LaTeX](https://www.latex-project.org/). O renderizador LaTeX requer o [pacote qcircuit](https://github.com/CQuIC/qcircuit). Selecione esses renderizadores definindo o argumento \"output\" como as cadeias de caracteres `mpl` e `latex`.\n",
        "\n",
        "<Admonition type=\"tip\">\n",
        "  Os usuários do OSX podem obter os pacotes LaTeX necessários por meio do [pacote mactex](https://www.tug.org/mactex/).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "3f9c61c9-58f9-4315-a639-455fa2e58450",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/3f9c61c9-58f9-4315-a639-455fa2e58450-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Matplotlib drawing\n",
        "circuit.draw(output=\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "94948dab-57de-45f0-8dd7-5901ae69b70a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/94948dab-57de-45f0-8dd7-5901ae69b70a-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Latex drawing\n",
        "circuit.draw(output=\"latex\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "51fc6f51-6345-435d-abed-857f29a3f451",
      "metadata": {},
      "source": [
        "<span id=\"save-output\" />\n",
        "\n",
        "### Salvar Saída\n",
        "\n",
        "Desenhar um circuito de grande escala em linha em um notebook Jupyter pode ser lento ou ilegível.\n",
        "Você pode salvar o diagrama diretamente em um arquivo e, em seguida, abri-lo em um visualizador de imagens e aumentar o zoom conforme necessário.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "17889caf-d953-4661-9188-00505c17064e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/17889caf-d953-4661-9188-00505c17064e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Save as an image using the Matplotlib drawer\n",
        "circuit.draw(output=\"mpl\", filename=\"circuit-mpl.jpeg\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "a36d1aa9-fa0d-4e27-ac83-5deee43a20dd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/a36d1aa9-fa0d-4e27-ac83-5deee43a20dd-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Or save a LaTeX rendering\n",
        "circuit.draw(output=\"latex\", filename=\"circuit-latex.pdf\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "78688e6c-3ed2-4ef2-b3db-80fdae35e585",
      "metadata": {
        "jp-MarkdownHeadingCollapsed": true
      },
      "source": [
        "<span id=\"control-circuit-drawings\" />\n",
        "\n",
        "### Desenhos do circuito de controle\n",
        "\n",
        "Por padrão, o método `draw()` retorna a imagem renderizada como um objeto e não produz nada. A classe exata retornada depende da saída especificada: `'text'` (o padrão) retorna um objeto `TextDrawer` , `'mpl'` retorna um objeto `matplotlib.Figure` e `latex` retorna um objeto `PIL.Image` . Os notebooks Jupyter entendem esses tipos de retorno e os renderizam corretamente, mas quando executados fora do Jupyter, as imagens não serão exibidas automaticamente.\n",
        "\n",
        "O método `draw()` tem argumentos opcionais para exibir ou salvar a saída. Quando especificado, o `filename` kwarg usa um caminho no qual salva a saída renderizada. Como alternativa, se você estiver usando as saídas `mpl` ou `latex` , poderá usar o kwarg `interactive` para abrir a imagem em uma nova janela (isso nem sempre funcionará em um notebook).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fc41270b-3518-40af-8921-dfa9666fc8e0",
      "metadata": {},
      "source": [
        "<span id=\"customize-the-output\" />\n",
        "\n",
        "### Personalizar a saída\n",
        "\n",
        "Dependendo da saída, também há opções para personalizar o diagrama do circuito.\n",
        "\n",
        "<span id=\"disable-plot-barriers-and-reverse-bit-order\" />\n",
        "\n",
        "#### Desativar barreiras de plotagem e inverter a ordem dos bits\n",
        "\n",
        "As duas primeiras opções são compartilhadas entre os três back-ends. Eles permitem que você configure as ordens de bits e se você desenha ou não barreiras. Eles podem ser definidos por `reverse_bits` kwarg e `plot_barriers` kwarg, respectivamente. Os exemplos a seguir funcionam com qualquer renderizador de saída; `mpl` é usado aqui para fins de brevidade.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "db61dc71-4cdc-4bb7-8139-8820e7785e55",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumRegister, ClassicalRegister\n",
        "\n",
        "# Draw a new circuit with barriers and more registers\n",
        "q_a = QuantumRegister(3, name=\"a\")\n",
        "q_b = QuantumRegister(5, name=\"b\")\n",
        "c_a = ClassicalRegister(3)\n",
        "c_b = ClassicalRegister(5)\n",
        "\n",
        "circuit = QuantumCircuit(q_a, q_b, c_a, c_b)\n",
        "circuit.x(q_a[1])\n",
        "circuit.x(q_b[1])\n",
        "circuit.x(q_b[2])\n",
        "circuit.x(q_b[4])\n",
        "circuit.barrier()\n",
        "circuit.h(q_a)\n",
        "circuit.barrier(q_a)\n",
        "circuit.h(q_b)\n",
        "circuit.cswap(q_b[0], q_b[1], q_b[2])\n",
        "circuit.cswap(q_b[2], q_b[3], q_b[4])\n",
        "circuit.cswap(q_b[3], q_b[4], q_b[0])\n",
        "circuit.barrier(q_b)\n",
        "circuit.measure(q_a, c_a)\n",
        "circuit.measure(q_b, c_b);"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "8e57cd43-8a48-469d-8f69-8e7c936d4a1e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/8e57cd43-8a48-469d-8f69-8e7c936d4a1e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw the circuit\n",
        "circuit.draw(output=\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "8e7a251a-0a4f-43e0-8cf5-48493df7bad9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/8e7a251a-0a4f-43e0-8cf5-48493df7bad9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw the circuit with reversed bit order\n",
        "circuit.draw(output=\"mpl\", reverse_bits=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "b4a601ad-1c04-4b16-afbd-ac5a0ad42653",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/b4a601ad-1c04-4b16-afbd-ac5a0ad42653-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw the circuit without barriers\n",
        "circuit.draw(output=\"mpl\", plot_barriers=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "18b0bfbe-b586-4182-9a0d-b858655a9240",
      "metadata": {},
      "source": [
        "<span id=\"renderer-specific-customizations\" />\n",
        "\n",
        "### Personalizações específicas do renderizador\n",
        "\n",
        "Algumas opções de personalização disponíveis são específicas de um renderizador.\n",
        "\n",
        "O argumento `fold` define uma largura máxima para a saída. No renderizador `text` , isso define o comprimento das linhas do diagrama antes de passar para a próxima linha.  Ao usar o renderizador 'mpl', esse é o número de camadas (visuais) antes de passar para a próxima linha.\n",
        "\n",
        "O renderizador `mpl` tem o `style` kwarg, que altera as cores e os contornos. Consulte a [documentação da API](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#draw) para obter mais detalhes.\n",
        "\n",
        "A opção `scale` dimensiona a saída dos renderizadores `mpl` e `latex` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "1e08bf74-378f-45e6-b195-a9539061013d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "   ┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»\n",
              "q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»\n",
              "   └───┘└───┘└───┘└───┘└───┘└───┘└───┘»\n",
              "«   ┌───┐┌───┐┌───┐\n",
              "«q: ┤ H ├┤ H ├┤ H ├\n",
              "«   └───┘└───┘└───┘"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "circuit = QuantumCircuit(1)\n",
        "for _ in range(10):\n",
        "    circuit.h(0)\n",
        "# limit line length to 40 characters\n",
        "circuit.draw(output=\"text\", fold=40)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "decadf88-4866-45a0-9e2f-836c51491f9e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/decadf88-4866-45a0-9e2f-836c51491f9e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Change the background color in mpl\n",
        "\n",
        "style = {\"backgroundcolor\": \"lightgreen\"}\n",
        "circuit.draw(output=\"mpl\", style=style)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "ade9a653-3243-4ac9-bb0e-c8fb82f7a034",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/ade9a653-3243-4ac9-bb0e-c8fb82f7a034-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Scale the mpl output to 1/2 the normal size\n",
        "circuit.draw(output=\"mpl\", scale=0.5)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "495b560a-d835-448b-aa01-5025a7a0689e",
      "metadata": {},
      "source": [
        "<span id=\"standalone-circuit-drawing-function\" />\n",
        "\n",
        "### Função autônoma de desenho de circuitos\n",
        "\n",
        "Se você tiver um aplicativo em que prefira desenhar um circuito com uma função autônoma em vez de um método de um objeto de circuito, poderá usar diretamente a função `circuit_drawer()` , que faz parte da interface pública estável de `qiskit.visualization`. A função se comporta de forma idêntica ao método `circuit.draw()` , exceto pelo fato de receber um objeto de circuito como argumento obrigatório.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "256dd092-b2eb-47af-a025-0ecdf85c2d5a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/visualize-circuits/extracted-outputs/256dd092-b2eb-47af-a025-0ecdf85c2d5a-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import circuit_drawer\n",
        "\n",
        "circuit_drawer(circuit, output=\"mpl\", plot_barriers=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0761df2f-183f-48e3-9070-766a9920c2b9",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Veja um exemplo de visualização de circuito no tutorial [do Algoritmo de Grover](/docs/tutorials/grovers-algorithm).\n",
        "  * Visualize circuitos simples usando [IBM Quantum Composer](/docs/guides/composer).\n",
        "  * [Visualize o tempo do circuito](/docs/guides/visualize-circuit-timing).\n",
        "  * Consulte a [documentação da API de visualizações do Qiskit](/docs/api/qiskit/visualization).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}