Ich möchte ein Scatter-Diagramm mit Latex realisieren! Eine ähnliche Fragestellung wurde hier schon einmal gepostet -> http://texwelt.de/wissen/fragen/17242/scatter-histogramm-mit-gnuplot-moglich

Leider kann ich diese Lösung nicht 1:1 übernehmen, da sich meine Wunsch-Darstellung des Diagramms ein wenig unterscheidet. Und zwar wie folgt:

Der ganze Bereich des Diagramms ist in Felder unterteilt (Klassen). Ich möchte diese Felder, die in meinem Fall alle gleich groß sind (konstante Klassenbreite) je nachdem wie viel Prozent der Werte einer Klasse angehören (Treffer innerhalb des jeweiligen Feldes) -> dieses Feld mit Farbe einfärben oder wenigstens die darin eingeschlossenen Punkte. Ich habe keine Ahnung welche Möglichkeit leichter zu realisieren ist bzw. wie das überhaupt realisierbar ist.

Ich hoffe ihr seht mein Anliegen nicht als frech an. Da ich explizit eine Frage in den Raum werfe und eine fertige Lösung verlange. Danke.

Solch eine Darstellung wäre Wünschenswert: Die Färbung der Felder. alt text

UPDATE: Hier mein leider nicht funktionstüchtiger Code: Meine Werte lese ich von einer .dat-Datei ein. Ich konnte den bestehenden Code nicht richtig ändern/adaptieren. Mein Ergebnis sieht vollkommen anders aus. Warum? Danke.

Open in Online-Editor
\begin{filecontents}{1.dat}
spalteB spalteA
1   2
3   2
-4  15
5   12
-30 10
20  1
30  2
5   8
-4  3
6   4
7   12
8   1
45  9
-3  45
2   45
4   23
6   56
-8  23  
12  12
56  12
6   4
-7  66
76  2
3   12
-2  7
4   3
6   2
-8  1
-12 1
-56 1
-64 3
-7  77
-76 43
1   34
5   23
7   23
12  2
45  2
\end{filecontents}

\documentclass{scrartcl} 
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{width=15cm,height=15cm} 
\begin{document}
\begin{center}
\begin{minipage}{\linewidth}
\centering
\begin{tikzpicture}

  \begin{axis}
  [ xmin=-80,
    xmax=80,
    ymin=-80,
    ymax=80,
    ylabel={$f(x)=x$},
    xlabel={$f(y)=x$},
    legend entries={$\sigma$},
    title=Test Diagramm Eins
  ]
    \addplot[
      matrix plot,mesh/rows=10,mesh/cols=10,
      point meta=explicit,
      shader=faceted,colormap/cool
    ] table[meta=z] {1.dat};
    \addplot[only marks,mark=o] table[x=spalteA,y=spalteB] {1.dat};
  \end{axis}

\end{tikzpicture}
\end{minipage}
\end{center}
\end{document}

gefragt 18 Aug '16, 10:02

Linux404's gravatar image

Linux404
3221422
Akzeptiert-Rate: 100%

bearbeitet 18 Aug '16, 15:25

Irgendwelchen Code kopieren ≠ Minimalbeispiel. Außerdem hast du beim Kopieren Fehler eingebaut.

(18 Aug '16, 10:56) Henri

@Henri, ok. Ich versuche heute noch ein Minimalbeispiel zu erstellen (ich hoffe ich schaff das bei dieser Thematik). Danke für dein Verständnis.

(18 Aug '16, 11:00) Linux404

@Henri siehe Update. Danke.

(18 Aug '16, 15:25) Linux404

Geht einigermaßen mit Lua.

Open in Online-Editor
\begin{filecontents*}{1.dat}
spalteB spalteA
1   2
3   2
-4  15
5   12
-30 10
20  1
30  2
5   8
-4  3
6   4
7   12
8   1
45  9
-3  45
2   45
4   23
6   56
-8  23  
12  12
56  12
6   4
-7  66
76  2
3   12
-2  7
4   3
6   2
-8  1
-12 1
-56 1
-64 3
-7  77
-76 43
1   34
5   23
7   23
12  2
45  2
\end{filecontents*}
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{statistics}
\usepackage{luacode}
\begin{luacode*}
-- http://lua-users.org/wiki/SplitJoin
function string:split(sep)
   local sep, fields = sep or ":", {}
   local pattern = string.format("([^%s]+)", sep)
   self:gsub(pattern, function(c) fields[#fields+1] = c end)
   return fields
end

function read_table(fname)
   local tab = {}
   for line in io.lines(fname) do
      local fields = line:split(' ')
      local _x, _y = fields[1], fields[2]
      local x, y = tonumber(_x), tonumber(_y)
      if x and y then
         tab[#tab+1] = { x = x, y = y }
      end
   end
   return tab
end

function generate_hist(tab,xmin,xmax,Nx,ymin,ymax,Ny)
   local xstep = (xmax - xmin) / (Nx-1)
   local ystep = (ymax - ymin) / (Ny-1)

   tex.sprint("{\r")
   tex.sprint("x y z\r")
   for x = xmin,xmax,xstep do
      for y = ymin,ymax,ystep do
         local bins = 0
         for i = 1,#tab do
            if (x-xstep/2 <= tab[i].x and tab[i].x < x+xstep/2) and 
               (y-ystep/2 <= tab[i].y and tab[i].y < y+ystep/2) then
               bins = bins + 1
            end
         end
         tex.sprint(x .. " " .. y .. " " .. bins .. "\r")
      end
      tex.sprint("\r")
   end
   tex.sprint("}")
end
\end{luacode*}
\newcommand\readtable[4]{%
  \directlua{tab = read_table("\luaescapestring{#1}")}
  \expandafter\pgfplotstableread\directlua{generate_hist(tab,#2,#3)}#4
}
\begin{document}
\readtable{1.dat}{-100,100,10}{0,80,10}\histtable
\begin{tikzpicture}
  \begin{axis}
    \addplot[
      matrix plot*,mesh/rows=10,mesh/cols=10,
      point meta=explicit,
      shader=faceted,colormap/cool
    ] table[meta=z] {\histtable};
    \addplot[only marks,mark=o] table {1.dat};
  \end{axis}
\end{tikzpicture}
\end{document}

alt text


Bevor ein Minimalbeispiel da war habe ich gaußverteilte Zufallszahlen geplottet.

Open in Online-Editor
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{statistics}
\usepackage{luacode}
\begin{luacode*}
-- Initialize the random number generator according to
-- http://lua-users.org/wiki/MathLibraryTutorial
math.randomseed( tonumber(tostring(os.time()):reverse():sub(1,6)) )

-- standard Box-Muller transform
-- https://en.wikipedia.org/wiki/Box-Muller_transform
function gauss_random(mu, sigma)
   -- State variables
   local generate = false
   local z0 = 0.0
   local z1 = 0.0

   -- Parameters
   mu = mu or 0.0
   sigma = sigma or 1.0

   function random()
      generate = not generate

      if (not generate) then
         return z1*sigma + mu;
      end

      local u1, u2
      repeat
         u1 = math.random()
         u2 = math.random()
      until ( u1 > 1e-16 )

      z0 = math.sqrt(-2.0 * math.log(u1)) * math.cos(2*math.pi * u2)
      z1 = math.sqrt(-2.0 * math.log(u1)) * math.sin(2*math.pi * u2)
      return z0*sigma + mu
   end

   return random
end

function generate(N)
   local tab = {}
   local gauss = gauss_random()
   for i = 1, N do
      tab[i] = { x = gauss(), y = gauss() }
   end
   return tab
end

function generate_table(tab)
   tex.sprint("{\r")
   tex.sprint("x y z\r")
   for i = 1, #tab do
      tex.sprint(tab[i].x .. " " .. tab[i].y .. " 0\r")
   end
   tex.sprint("}")
end

function generate_hist(tab,xmin,xmax,Nx,ymin,ymax,Ny)
   local xstep = (xmax - xmin) / (Nx-1)
   local ystep = (ymax - ymin) / (Ny-1)

   tex.sprint("{\r")
   tex.sprint("x y z\r")
   for x = xmin,xmax,xstep do
      for y = ymin,ymax,ystep do
         local bins = 0
         for i = 1,#tab do
            if (x-xstep/2 <= tab[i].x and tab[i].x < x+xstep/2) and 
               (y-ystep/2 <= tab[i].y and tab[i].y < y+ystep/2) then
               bins = bins + 1
            end
         end
         tex.sprint(x .. " " .. y .. " " .. bins .. "\r")
      end
      tex.sprint("\r")
   end
   tex.sprint("}")

end
\end{luacode*}
\newcommand\generatetable[5]{%
  \directlua{tab = generate(#1)}
  \expandafter\pgfplotstableread\directlua{generate_table(tab)}#4
  \expandafter\pgfplotstableread\directlua{generate_hist(tab,#2,#3)}#5
}
\begin{document}
\generatetable{400}{-4,4,10}{-4,4,10}\pointtable\histtable
\begin{tikzpicture}
  \begin{axis}
    \addplot[
      matrix plot,mesh/rows=10,mesh/cols=10,
      point meta=explicit,
      shader=faceted,colormap/cool
    ] table[meta=z] {\histtable};
    \addplot[only marks,mark=o] table {\pointtable};
  \end{axis}
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 18 Aug '16, 11:50

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 19 Aug '16, 10:51

wow danke... ich werde den Code durch studieren... Könnte ich mich am Montag noch einmal melden sollte ich Probleme haben?

(18 Aug '16, 12:00) Linux404

@Henri danke für deinen Einsatz. Ich kann mich leider nur mit einem einfachen "Dankeschön" bedanken. Leider funktioniert der Code bei mir nicht aufgrund dieser Fehlermeldung: Package luacode Error: LuaTeX is required for this package. Aborting. to prevent additional errors.}

Obowhl ich soeben das Package luacode hinzugefügt habe. -> https://www.ctan.org/tex-archive/macros/luatex/latex/luacode?lang=de

Meine TexStudio Version:TeXstudio 2.5.2 (SVN 3661) Nutze Qt-Version 4.8.1, kompiliert mit QT 4.8.1 R Muss ich das TexStudio konfiguieren? Danke.

(19 Aug '16, 09:22) Linux404

@Linux404 Wie die Fehlermeldung schon sagt musst du LuaTeX verwenden. In diesem Screenshot von meinem TeXmaker siehst du was du klicken musst.

(19 Aug '16, 09:29) Henri

@Linux404 Wenn du lieber »Quick Build« verwenden möchtest musst du in den Einstellungen »Quick Build« auf »LuaLaTeX + View PDF« setzen (Screenshot).

(19 Aug '16, 09:38) Henri

@Henri Ich habe die Einstellung getroffen. Jetzt kommt keine Fehlermeldungen ausser: attempt to call field 'unpack' (a nil value) <directlua >:1: in main chunk. ...le{1.dat}{-100,100,10}{0,80,10}histtable

(19 Aug '16, 09:39) Linux404

@Linux404 Ahhh, das ist natürlich doof. Die Funktion table.unpack gibt es erst ab Lua 5.2. Dein LuaTeX ist vermutlich zu alt. Setz mal das folgende Dokument:

\documentclass{article}
\begin{document}
\directlua{tex.sprint(_VERSION)}
\end{document}
Wenn im PDF »Lua 5.1« steht musst du ein Update machen.

(19 Aug '16, 09:43) Henri

@Henri Ja ich habe leider die Version 5.1 Wie geht ein Update von statten? Bzw. wo finde ich den Download-Link? Ich bin schon verzweifelt.... Latex ist ziemlich mächtig

(19 Aug '16, 10:10) Linux404

@Linux404 Ich habe keine Ahnung welche Distribution du benutzt, aber ich vermute mal, dass es MikTeX ist. Hier ist die Anleitung: http://docs.miktex.org/manual/updating.html

(19 Aug '16, 10:13) Henri

@Linux404 Ich habe table.unpack ersetzt durch eine andere Konstruktion. Jetzt sollte es auch mit Lua 5.1 gehen.

(19 Aug '16, 10:50) Henri

@Henri ich muss das lua package manuell downloaden da der uni rechner das miktex update unterbindet... Leider geht dein Update bei mir auch nicht. Aber er zeigt was an :)

(19 Aug '16, 13:15) Linux404
Ergebnis 5 von 10 show 5 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×53
×4

gestellte Frage: 18 Aug '16, 10:02

Frage wurde gesehen: 6,128 Mal

zuletzt geändert: 19 Aug '16, 13:15