Im o.g. Thread wird eine Mehrfachbennung von Ich möchte hierbei die Koordinatentabelle um einen Anker für die Textposition erweitern. Öffne in Overleaf
% Koordinatentabelle table[header=true, x index=1, y index=2, row sep=\\] { Nr x y Testposition\\ 0 0 0 south \\ % 0. Aliaspunkt. SOLL: south als Default 1 1 0 \\ 2 0 1 north \\ % Ausnahme 3 1 1 \\ }; Leider wird dabei nur letzte angebene Anker verwendet Öffne in Overleaf
\documentclass[margin=5mm, tikz]{standalone} \usepackage{pgfplots} \usepgfplotslibrary{patchplots} \pgfplotsset{compat=1.13} % Methode festlegen, die Mehrfachplatzierung (je nach Pfadanzahl) % von Punktbezeichnungen verhindert ============ \xdef\LstPN{0} \newif\ifDupe \pgfplotsset{avoid dupes/.code={\Dupefalse \foreach \X in \LstPN {\pgfmathtruncatemacro{\itest}{ifthenelse(\X==\punktnummer,1,0) % Geht natürlich nicht %\pgfmathsetmacro{\Ankertest}{ifthenelse(\anker="north","north","south") } \ifnum\itest=1 \global\Dupetrue \breakforeach \fi} \ifDupe % auskommentieren: \typeout{\punktnummer\space ist\space ein\space Duplikat!}% \xdef\punktnummer{} %macht mehrfache Nummern einfach unsichtbar %\pgfkeysalso{/tikz/anchor=\anker} % geht auch nicht \else \xdef\LstPN{\LstPN,\punktnummer} \fi}} % ============ \begin{document} \begin{tikzpicture} \begin{axis}[hide axis] \addplot+[ table/row sep=newline, patch, % Plot-Typ patch type=polygon, vertex count=2, % damit nur Kanten, keine Flächen, gezeichnet werden % % Angabe der Verbindungskanten ===================== patch table with point meta={ Startpkt Endpkt colordata \\ %0 0 \\ 1 1 \\ 2 2 \\ 3 3 \\% Bis hierhin ok.... 1 3 \\% Ab hier wird überschrieben 1 2 \\ }, % % Beschriftung visualization depends on={value \thisrowno{0} \as \punktnummer}, visualization depends on={value \thisrowno{3} \as \anker}, every node near coord/.append style={ %anchor=\anker, /pgfplots/avoid dupes,% Methode für Mehrfachplatzierung anwenden }, nodes near coords={\punktnummer, \anker}, % Geht nicht nodes near coords style={ anchor=\anker }, ] % Koordinatentabelle table[header=true, x index=1, y index=2, row sep=\\] { Nr x y Testposition\\ 0 0 0 south \\ % 0. Aliaspunkt. SOLL: south als Default 1 1 0 \\ 2 0 1 north \\ % Ausnahme 3 1 1 \\ }; \end{axis} \end{tikzpicture} \end{document} gefragt 17 Sep '18, 20:36 cis |
Das ist keine richtige Antwort, aber ein Erklärungsversuch, was bei Deinem Versuch schief läuft. (Und naja, in dem Beispiel ist das Ergebnis korrekt.) Was läuft schief? Die Koordinaten werden in einem Loop über die erste Tabelle erzeugt. Zumindest macht Dein Code das so, und aus Gründen, die ich nicht 100% verstehe, willst Du das so. Ansonsten gäbe es ja das Problem der Duplikate nicht. Bitte korrigiere mich, wenn das nicht stimmt: Du willst im Prinzip in der zweiten Tabelle einen riesigen Datensatz hinterlegen, aber nur die Koordinaten markieren, die auch wirklich in irgendwelche patches eingebaut sind, oder? (Ansonsten könnten wir uns den ganzen Zauber sparen, indem wir die Wo ist das Problem? Aus irgendwelchen Gründen, die ich nicht verstehe, wird, wenn pgfplots die Daten aus der zweiten Tabelle ausliest, die Information über den Anker schlicht ignoriert. M.a.W. die zur Punktnummer gehörigen Koordinaten werden ausgelesen/aktualisiert, nicht aber der Anker. Das wird mit dem ersten typeout für neue Koordinaten gezeigt. Der untige Code gibt die typeouts Öffne in Overleaf
1 ist neu mit urprgl. Anker=north 1 ist neu mit Anker=north 1 ist ein Duplikat! 2 ist neu mit urprgl. Anker=north 2 ist neu mit Anker=south 2 ist ein Duplikat! 3 ist neu mit urprgl. Anker=north 3 ist neu mit Anker=south 3 ist ein Duplikat! 1 ist ein Duplikat! 1 ist ein Duplikat! 1 ist ein Duplikat! 1 ist ein Duplikat! Wie Du siehst, variiert die Punkntnummer, nicht aber der ursprüngliche Anker. Und das, obwohl beide mit Wie kommt man hier weiter? Ich habe einfach eine Liste Hier ist der Code: Öffne in Overleaf
\documentclass[margin=5mm, tikz]{standalone} \usepackage{pgfplots} \usepgfplotslibrary{patchplots} \pgfplotsset{compat=1.13} % Methode festlegen, die Mehrfachplatzierung (je nach Pfadanzahl) % von Punktbezeichnungen verhindert ============ \xdef\LstPN{0} \newif\ifDupe \pgfplotsset{avoid dupes/.code={\Dupefalse \foreach \X in \LstPN {\pgfmathtruncatemacro{\itest}{ifthenelse(\X==\punktnummer,1,0) % Geht natürlich nicht %\pgfmathsetmacro{\Ankertest}{ifthenelse(\anker="north","north","south") } \ifnum\itest=1 \global\Dupetrue \breakforeach \fi} \ifDupe % auskommentieren: \typeout{\punktnummer\space ist\space ein\space Duplikat!}% %\xdef\punktnummer{} %macht mehrfache Nummern einfach unsichtbar \pgfkeysalso{/tikz/opacity=0} % geht auch nicht \else \xdef\LstPN{\LstPN,\punktnummer} \typeout{\punktnummer\space ist\space neu\space mit\space urprgl.\space Anker=\anker} \foreach \X in \LstExcept {\ifnum\X=\punktnummer \pgfkeysalso{/tikz/anchor=-90} \xdef\anker{south} \fi} %\pgfmathsetmacro{\anker}{\LstAnker[\punktnummer]} \typeout{\punktnummer\space ist\space neu\space mit\space Anker=\anker} \fi}} % ============ \begin{document} \xdef\LstExcept{2,3} \begin{tikzpicture} \begin{axis}[hide axis] \addplot+[ table/row sep=newline, patch, % Plot-Typ patch type=polygon, vertex count=2, % damit nur Kanten, keine Flächen, gezeichnet werden % % Angabe der Verbindungskanten ===================== patch table with point meta={ Startpkt Endpkt colordata \\ %0 0 \\ 1 1 \\ 2 2 \\ 3 3 \\% Bis hierhin ok.... 1 3 \\% Ab hier wird überschrieben 1 2 \\ }, % % Beschriftung visualization depends on={value \thisrowno{0} \as \punktnummer}, visualization depends on={value \thisrowno{3} \as \anker}, every node near coord/.append style={ %anchor=\anker, /pgfplots/avoid dupes,% Methode für Mehrfachplatzierung anwenden }, nodes near coords={\punktnummer}, % Geht nicht nodes near coords style={ anchor=\anker }, ] % Koordinatentabelle table[header=true, x index=1, y index=2, row sep=\\] { Nr x y Testposition\\ 0 0 0 south \\ % 0. Aliaspunkt. SOLL: south als Default 1 1 0 south \\ 2 0 1 north \\ % Ausnahme 3 1 1 \\ }; \end{axis} \end{tikzpicture} \end{document} KOMMENTAR: Falls es irgendwie so sein sollte, dass man die Spalte Positionierung nicht wirklich auslesen kann, kannst Du evtl. ADDENDUM: Ich kann die Spalte "Textposition" problemlos entfernen. Dieser Code ist etwas flexibler. Öffne in Overleaf
\documentclass[margin=5mm, tikz]{standalone} \usepackage{pgfplots} \usepgfplotslibrary{patchplots} \pgfplotsset{compat=1.13} % Methode festlegen, die Mehrfachplatzierung (je nach Pfadanzahl) % von Punktbezeichnungen verhindert ============ \xdef\LstPN{0} \newif\ifDupe \pgfplotsset{avoid dupes/.code={\Dupefalse \foreach \X in \LstPN {\pgfmathtruncatemacro{\itest}{ifthenelse(\X==\punktnummer,1,0) % Geht natürlich nicht %\pgfmathsetmacro{\Ankertest}{ifthenelse(\anker="north","north","south") } \ifnum\itest=1 \global\Dupetrue \breakforeach \fi} \ifDupe % auskommentieren: \typeout{\punktnummer\space ist\space ein\space Duplikat!}% %\xdef\punktnummer{} %macht mehrfache Nummern einfach unsichtbar \pgfkeysalso{/tikz/opacity=0} % geht auch nicht \else \xdef\anker{north} \xdef\LstPN{\LstPN,\punktnummer} \foreach \X/\neueranker in \LstExcept {\typeout{\X/\neueranker} \ifnum\X=\punktnummer \xdef\anker{\neueranker} \fi} %\pgfmathsetmacro{\anker}{\LstAnker[\punktnummer]} \typeout{\punktnummer\space ist\space neu\space mit\space Anker=\anker} \pgfkeysalso{/tikz/anchor=\anker} \fi}} % ============ \begin{document} \xdef\LstExcept{{2/-90},{3/0}} \begin{tikzpicture} \begin{axis}[hide axis] \addplot+[ table/row sep=newline, patch, % Plot-Typ patch type=polygon, vertex count=2, % damit nur Kanten, keine Flächen, gezeichnet werden % % Angabe der Verbindungskanten ===================== patch table with point meta={ Startpkt Endpkt colordata \\ %0 0 \\ 1 1 \\ 2 2 \\ 3 3 \\% Bis hierhin ok.... 1 3 \\% Ab hier wird überschrieben 1 2 \\ }, % % Beschriftung visualization depends on={value \thisrowno{0} \as \punktnummer}, every node near coord/.append style={ /pgfplots/avoid dupes,% Methode für Mehrfachplatzierung anwenden }, nodes near coords={\punktnummer}, % Geht nicht nodes near coords style={ anchor=\anker }, ] % Koordinatentabelle table[header=true, x index=1, y index=2, row sep=\\] { Nr x y \\ 0 0 0 \\ % 0. Aliaspunkt. SOLL: south als Default 1 1 0 \\ 2 0 1 \\ % Ausnahme 3 1 1 \\ }; \end{axis} \end{tikzpicture} \end{document} Öhmm, also erstmal danke. Aber verstehe ich das richtig, dass bei 1000 Punkten auch Aber mir ist hier die Idee gekommen, dass man (leicht weniger elegant) die Spalte
(19 Sep '18, 03:54)
cis
@cis Wie gesagt, die Liste der tatsächlich benötigten Koordinaten ist in
(19 Sep '18, 05:26)
Community
Also ich habe einen Punkt ergänzt
und dann kam
(19 Sep '18, 16:53)
cis
@cis Das verstehe ich Alles. Mein Post oben startet mit "Das ist keine richtige Antwort, aber ein Erklärungsversuch, was bei Deinem Versuch schief läuft.". Wie gesagt, unter der Annahme, dass wir es nicht hinbekommen, dass der Anker beim Durchlauf aktualisiert wird, kann man die beiden Ideen von meinem obigen Kommentar verwenden. Oder, wenn es wirklich nur ein paar Anker gibt, die anders gesetzt werden sollen, kann man einfach eine Liste dieser Punkte erstellen, sagen wir
(19 Sep '18, 18:58)
Community
@Murmeltier Also mir kam noch die (erfolglos versuchte) Idee, einfach zwei Anker zu verwenden
Aber da wärst Du sicher selbst drauf gekommen; und falls es so ginge, hättest Du es gemacht.
(19 Sep '18, 19:06)
cis
@cis Ich habe jetzt den Code überarbeitet. Du musst nur eine Liste erstellen, in der die Punkte gelistet sind, wo der Anker anders gesetzt werden soll.
(19 Sep '18, 19:09)
Community
Ja sehr gut! Also an sich ist doch die Splate
(19 Sep '18, 19:31)
cis
Kann es sein, dass Du
(19 Sep '18, 19:51)
Community
Ich glaube, ich habe es geschafft:
dann kann ich
(19 Sep '18, 19:58)
cis
1
Super! Du kriegst von den Streichholzgraphern das goldene Streichholz verliehen.
(19 Sep '18, 20:24)
cis
Ergebnis 5 von 11
show 6 more comments
|
Ja, dann geht es "nur so". Aber das kann höchstens noch @Murmeltier, weil es eine einfache Ergänzung seines Unterprogramms sein dürfte; ich die ich gerade nicht komme.
Ich habe
nodes near coords={\punktnummer, \anker}
ergänzt damit das Problem sichtbar wird.