Ich möchte ein Scatter-Diagramm mit Latex realisieren! Eine ähnliche Fragestellung wurde hier schon einmal gepostet ->
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. 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 |
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} 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} beantwortet 18 Aug '16, 11:50 Henri 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
(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
(19 Aug '16, 10:50)
Henri
Ergebnis 5 von 10
show 5 more comments
|
Irgendwelchen Code kopieren ≠ Minimalbeispiel. Außerdem hast du beim Kopieren Fehler eingebaut.
@Henri, ok. Ich versuche heute noch ein Minimalbeispiel zu erstellen (ich hoffe ich schaff das bei dieser Thematik). Danke für dein Verständnis.
@Henri siehe Update. Danke.