Wie komme ich zu folgender Darstellung meines Diagrammes? Danke für eure Hilfe.

alt text

Quellcode:

Open in Online-Editor
\documentclass{article}
\usepackage{tikz,pgfplots}

\begin{document}
\pgfplotsset{width=15cm,height=10cm}
\begin{tikzpicture}
\begin{axis}[colorbar sampled,
    colorbar style={samples=13},
    grid=both,
    scale only axis=true,
    width=10cm,
    height=15cm,
    xtick={0,1,...,10},
    ytick={-8,-7,...,10},
    xmin=0,
    xmax=10,
    ymin=-8,
    ymax=8,
    ]

\addplot3[
    scatter,mark=text, text mark={\rule{6mm}{3mm}},only marks,
    point meta=\thisrow{myvalue}
    ]
    table {
    x y color myvalue
2 3 1 100
4 3 2 3
2 7 3 0.75
7 7 4 45
8 5 2 3
2 5 1 10
4 -4 2 1
4 1 3 75
5 -1 4 4
5 2 2 3
1 -2 1 10
2 5 2 5
3 -8 3 75
4 5 4 42
7 -2 2 2
    };
\end{axis}
\end{tikzpicture}

\end{document}

gefragt 30 Aug '16, 04:11

Linux404's gravatar image

Linux404
322321
Akzeptiert: 62%

3

Das geht nicht ohne vorherige Verarbeitung mit einem externen Programm. Schau mal hier: https://tex.stackexchange.com/questions/52987/3-dimensional-histogram-in-pgfplots

(30 Aug '16, 04:26) Henri

Hier ist ein Vorschlag. pgfplots hat die Möglichkeit, in einem scatter plot Würfel zu zeichnen und man kann die Längen der Kanten ändern.

Öffne in Overleaf
\documentclass[tikz,border=3.14pt]{standalone}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}
% from https://tex.stackexchange.com/a/102770/121799
\def\pgfplotsinvokeiflessthan#1#2#3#4{%
    \pgfkeysvalueof{/pgfplots/iflessthan/.@cmd}{#1}{#2}{#3}{#4}\pgfeov
}%
\def\pgfplotsmulticmpthree#1#2#3#4#5#6\do#7#8{%
    \pgfplotsset{float <}%
    \pgfplotsinvokeiflessthan{#1}{#4}{%
        % first key <:
        #7%
    }{%
        \pgfplotsinvokeiflessthan{#4}{#1}{%
            % first key >:
            #8%
        }{%
            % first key ==:
            \pgfplotsset{float <}%
            \pgfplotsinvokeiflessthan{#2}{#5}{%
                % second key <
                #7%
            }{%
                \pgfplotsinvokeiflessthan{#5}{#2}{%
                    % second key >
                    #8%
                }{%
                    % second key ==
                    \pgfplotsset{float <}%
                    \pgfplotsinvokeiflessthan{#3}{#6}{%
                        % third key <
                        #7%
                    }{%
                        % third key >=
                        #8%
                    }%
                }%
            }%
        }%
    }%
}%

\begin{document}
\pgfplotstableread[col sep=comma,header=true]{%
x,y,color,myvalue
2,3,1,100
4,3,2,3
2,7,3,0.75
7,7,4,45
8,5,2,3
2,5,1,10
4,-4,2,1
4,1,3,75
5,-1,4,4
5,2,2,3
1,-2,1,10
2,5,2,5
3,-8,3,75
4,5,4,42
7,-2,2,2
}{\datatable}
%
%\pgfplotstablesort[col sep=comma,header=true]\resulttable{\datatable}
\pgfplotstablesort[create on use/sortkey/.style={
        create col/assign/.code={%
            \edef\entry{{\thisrow{x}}{\thisrow{y}}{\thisrow{myvalue}}}%
            \pgfkeyslet{/pgfplots/table/create col/next content}\entry
        }
    },
    sort key=sortkey,
    sort cmp={%
        iflessthan/.code args={#1#2#3#4}{%
            \edef\temp{#1#2}%
            \expandafter\pgfplotsmulticmpthree\temp\do{#3}{#4}%
        },
    },
    sort,
    columns/Mtx/.style={string type},
    columns/Kind/.style={string type},]\resulttable{\datatable}

\begin{tikzpicture}%[x={(0.866cm,-0.5cm)},y={(0.866cm,0.5cm)},z={(0cm,1 cm)}]
\pgfplotsset{set layers}
\begin{axis}[% from section 4.6.4 of the pgfplotsmanual
        view={120}{40},
        width=320pt,
        height=280pt,
        z buffer=none,
        xmin=-1,xmax=9,
        ymin=-10,ymax=8,
        zmin=0,zmax=200,
        enlargelimits=upper,
        ztick={0,100,200},
        zticklabels={0,50,100}, % here one has to "cheat"
        % meaning that one has to put labels which are the actual value 
        % divided by 2. This is because the bars will be centered at these
        % values
        xtick=data,
        extra tick style={grid=major},
        ytick=data,
        grid=minor,
        xlabel={$x$},
        ylabel={$y$},
        zlabel={$z$},
        minor tick num=1,
        point meta=explicit,
        colormap name=viridis,
        scatter/use mapped color={
            draw=mapped color,fill=mapped color!70},
        execute at begin plot={}            
        ]
\path let \p1=($(axis cs:0,0,1)-(axis cs:0,0,0)$) in 
\pgfextra{\pgfmathsetmacro{\conv}{2*\y1}
\typeout{Kindly\space\space consider\space setting\space the\space 
        prefactor\space of\space z\space to\space \conv}};      
\addplot3 [visualization depends on={
0.9952*z \as \myz}, % you'll get told how to adjust the prefactor
scatter/@pre marker code/.append style={/pgfplots/cube/size z=\myz pt},%
scatter,only marks,
mark=cube*,mark size=5,opacity=1]
 table[x expr={\thisrow{x}},y expr={\thisrow{y}},z
 expr={1*\thisrow{myvalue}},
 meta expr={\thisrow{color}}
        ] \resulttable;
    \end{axis}
\end{tikzpicture}
\end{document}

alt text

UPDATE: Mein ursprünglicher Code hatte einen Fehler, die Balken müssen anders sortiert werden. Glücklicherweise bekommt man bei pgfplots die Lösung gleich mitgeliefert. ;-) Der Code spuckt jetzt einen Skalierungsfaktor aus, der eingetragen werden muss, und zwar ist das 0.9952 in 0.9952*z \as \myz. Ich habe es nicht geschafft, das zu automatisieren. (Die einzige Möglichkeit, die mir einfällt, wäre einen leeren plot in eine \savebox zu schustern, dort den Skalierungsfaktor zu berechnen und dann den richtigen Plot zu fahren. Aber das würde dazu führen, dass der Benutzer auch alles in dein Fake-Plot tut, oder dass ich ein kompliziertes Makro schreibe. Mir erscheint daher, dass das kleinste Übel ist, dass man den Wert nach dem Durchlauf einfach einträgt. Falls jemand einen besseren Vorschlag hat, würde ich den gerne hören, insbesondere wenn der jemand Feuersänger heisst. ;-)

Permanenter link

beantwortet 08 Apr, 00:50

Murmeltier's gravatar image

Murmeltier
1.9k64

bearbeitet 07 Jun, 16:35

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×261
×40

Frage gestellt: 30 Aug '16, 04:11

Frage wurde angeschaut: 1,881 Mal

Zuletzt aktualisiert: 07 Jun, 16:35