Невозможно установить текст и его булавку в правильной ориентации в круговой диаграмме Tikz

Невозможно установить текст и его булавку в правильной ориентации в круговой диаграмме Tikz

Я изменяю круговую диаграмму, которая доступназдесь. В случае небольших срезов текст внутри круговой диаграммы накладывается друг на друга. Поэтому я пытаюсь написать текст и значение за пределами диаграммы. Ниже представлен мой измененный код Latex-

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}

\makeatletter
\def\tikz@auto@anchor{%
    \pgfmathtruncatemacro\angle{atan2(\pgf@x,\pgf@y)-90}
    \edef\tikz@anchor{\angle}%
}
\makeatother

\begin{document}

\begin{figure}[h]
    \def\angle{0}
    \def\radius{2}
    \def\cyclelist{{"orange","blue","gray","red","green","cyan","magenta"}}

    \centering
    \newcount\cyclecount \cyclecount=-1
    \newcount\ind \ind=-1
    \begin{tikzpicture}[nodes = {font=\small}]
      \foreach \percent/\name in {
        2/3,
        2/4,
        2/5,
        18/7,
        13/8,
        63/9,
        } {
          \ifx\percent\empty\else               % If \percent is empty, do nothing
            \global\advance\cyclecount by 1     % Advance cyclecount
            \global\advance\ind by 1            % Advance list index
            \ifnum6<\cyclecount                 % If cyclecount is larger than list
              \global\cyclecount=0              %   reset cyclecount and
              \global\ind=0                     %   reset list index
            \fi
            \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
            \edef\color{\pgfmathresult}         %   and store as \color
            \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
              arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
            \node[pin={[pin distance=1cm]\angle+0.5*\percent*3.6:{\name~[\percent\%]}}]
              at (\angle+0.5*\percent*3.6:\radius) {};
            \pgfmathparse{\angle+\percent*3.6}  % Advance angle
            \xdef\angle{\pgfmathresult}         %   and store in \angle
          \fi
        };
    \end{tikzpicture}
\end{figure}
\end{document}

Я следовал некоторым ответам, данным дляКак принудительно изменить угол наклона штифта TikZ?идлина вывода pgfplotно они не работают как надо. Ниже представлен скриншот сгенерированного pdf-

введите описание изображения здесь

У меня есть следующие вопросы-

  1. Как правильно сориентировать штифт, т.е. направить его к центру круга
  2. Угол, под которым ориентированы текст и булавка, должен составлять половину угла этого фрагмента.

решение1

Я бы не стал использовать эту pinопцию (вам в любом случае придется рассчитывать позиции!)

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}

\begin{document}

\begin{figure}[h]
    \def\angle{0}
    \def\radius{2}
    \def\labelradius{3}
    \def\cyclelist{{"orange","blue","gray","red","green","cyan","magenta"}}

    \centering
    \newcount\cyclecount \cyclecount=-1
    \newcount\ind \ind=-1
    \begin{tikzpicture}[nodes = {font=\small}]
      \foreach \percent/\name in {
        2/3,
        2/4,
        2/5,
        18/7,
        13/8,
        63/9,
        } {
          \ifx\percent\empty\else               % If \percent is empty, do nothing
            \global\advance\cyclecount by 1     % Advance cyclecount
            \global\advance\ind by 1            % Advance list index
            \ifnum6<\cyclecount                 % If cyclecount is larger than list
              \global\cyclecount=0              %   reset cyclecount and
              \global\ind=0                     %   reset list index
            \fi
            \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
            \edef\color{\pgfmathresult}         %   and store as \color
            \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
              arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
            % \node[pin={[pin distance=1cm]\angle+0.5*\percent*3.6:{\name~[\percent\%]}}]
            %   at (\angle+0.5*\percent*3.6:\radius) {};
            \draw[draw=gray, shorten >=2pt] (\angle+0.5*\percent*3.6:\labelradius) node {\name~[\percent\%]} edge (\angle+0.5*\percent*3.6:\radius);
            \pgfmathparse{\angle+\percent*3.6}  % Advance angle
            \xdef\angle{\pgfmathresult}         %   and store in \angle
          \fi
        };
    \end{tikzpicture}
\end{figure}
\end{document}

предварительный просмотр

решение2

Решение PSTricks:

\documentclass{article}

\usepackage{siunitx}
\usepackage{pstricks-add}

\def\slice[#1](#2)#3#4{
  \rput(psChartI#2){\SI{#3}{\tonne}}
  \ncline{psChartO#2}{psChart#2}
  \nput{#1}{psChartO#2}{#4}
}
% Use of the \slice macro:
% \slice%
% [position of outer node, relative to the line end-point]
% (slice number)
% {size of the slice, relative to the whole pie}
% {outer node}


\begin{document}

\begin{figure}
\def\before{54}
\def\under{594}
\def\after{890}
\centering
 \psset{
   unit = 2.8,
   nodesepB = -5pt
 }
  \begin{pspicture}(-1,-1.37)(1.5,1.4)
    \psChart[
      userColor = {red!70, green!70, blue!70},
      chartNodeO = 1.2,
      shadow = true,
      shadowsize = 5pt,
      linewidth = 0
    ]{\before, \under, \after}{}{}
    \slice[0](1){\before}{Before}
    \slice[90](2){\under}{Under}
    \slice[270](3){\after}{After}
  \end{pspicture}
 \caption{Distribution of something.}
 \label{fig:piechart}
\end{figure}
This is figure~\ref{fig:piechart}.

\end{document}

выход

Подробнее о \psChartмакросе см.страница 16 в pstricks-addруководстве.

решение3

Вы можете проверитьэтот недавний вопрос. Форму булавки можно изменить, но основная идея та же.

Связанный контент