Antworte auf:  einzelne Histogrammbalken einfärben von AnjaSTG
Forum:  Textsatz mit LaTeX, moderiert von: Stefan_K

[Zur Forum-Gliederung] [Wie man Fragen beantwortet] [Themenstart einblenden]

  Alle registrierten Mitglieder können Mitteilungen schreiben.
Benutzername:
Passwort:
Nachricht-Icon:                   
                  
              
Nachricht:


 
 


Input assistance tools (JavaScript): [Link extern intern] [MathML?] [$$?]
[fed-area] [LaTeX-inline] [LaTeX-display] [Tikz] [hide-area][show-area] [Source code [num.]][?]
 Show Preview      Write using fedgeo formula editor or Latex.

Smilies for your message:
😃 😄 😁 🙂 🙃 😉 🤗 🤫 🤔 🙄 😴 🤒 😎 😮 😲 😂
🙁 😖 😒 😐 😡 👌 👍 👎 🤢 🤧 🥵 🥶 😵 🤯 😛 😷
Optionen: Deaktiviere HTML in dieser Nachricht
Deaktiviere MATHML in dieser Nachricht. Wenn Dein Text $-Zeichen enthält, die nicht LaTeX-Formeln begrenzen.
Deaktiviere Smilies in dieser Nachricht
Zeige die Signatur (Kann in 'Mein Profil' editiert werden.)
    [Abbrechen]
 
Beachte bitte die [Forumregeln]


Themenübersicht
MrTikZ
Aktiv
Dabei seit: 22.03.2020
Mitteilungen: 46
Herkunft:
 Beitrag No.5, eingetragen 2020-04-06 13:47    [Diesen Beitrag zitieren]

Wie schon erwähnt ist es sinnvoll die Daten komplexerer Graphen mit einem CAS zu erzeugen.

Das Programm
Sage
reset()
os.chdir('C:\Users\ccc\Desktop\Test\SageTeX\BinomialVerteilung')
print os.getcwd()
#%save ProgrammBinomalVerteilung01 -f 1 
 
n = 2000
p = 0.2
 
import scipy.stats
binom_dist = scipy.stats.binom(n,p)
 
## Graph
data = [binom_dist.pmf(x) for x in range(n)]
Layout = dict(frame=False, axes_labels=['$k$','$B(k,{},{})$'.format(n,float(p))])
BarChart = bar_chart(data, **Layout)
ListPlot = list_plot(data, plotjoined=True)
show(BarChart + ListPlot)
 
## Daten 
data = [(k, binom_dist.pmf(k)) for k in range(n)]
pattern = "{:5}, {:15}"
out_str = '\n'.join([pattern.format(*tup) for tup in data])
#print(out_str)
 
def save_string(path, string, mode='w'):
    with open(path, mode) as file:
        file.write(string)
 
save_string('data.txt', out_str) 

liefert
data.txt
    0, 1.5134705823e-194
    1, 7.56735291154e-192
    2, 1.89089230877e-189
    3, 3.14833569411e-187
    4, 3.9295164882e-185
    5, 3.92165745522e-183
    6, 3.25987775965e-181
.....
.....

Die Datei data.txt kann nun mit pgfplots verarbeitet werden:
LaTeX
%\documentclass[border=2pt, varwidth]{standalone}
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
 
\begin{tikzpicture}[font=\footnotesize]
\begin{axis}[
axis lines=middle, 
axis line style = {-latex},
scaled y ticks=false, 
y tick label style={
/pgf/number format/.cd,fixed, fixed zerofill, precision=3,/tikz/.cd},
x tick label style={
/pgf/number format/.cd,1000 sep={}},
enlarge x limits={rel=0.1,upper},
enlarge y limits={rel=0.1,upper},
xlabel={$k$},
xlabel style={anchor=north west, inner sep=1pt},
ylabel={$B(k,n,p)$},
ylabel style={anchor=east, inner sep=1pt},
]
\addplot[ybar,
bar width=0.1,
draw=none, thin, fill=cyan, 
] table [col sep=comma, y index=1] {data.txt};
% Hüllkurve
\addplot[draw=blue, fill=none, smooth] table [col sep=comma, y index=1] {data.txt};
\end{axis} 
\end{tikzpicture}
\end{document}






Ich will das Ganze direkt im Dokument erstellen, dafür nutze ich SageTeX.
Und ich will den Code elegant vom Editor aus übersetzen, dafür nutze ich arara mit der Regel
% arara: sagetex
sagetex.yaml
!config
# SageTeX-Rule for arara.
#
# Dear Windows-users, please check the paths
# pathToBashExecutive    and    pathToSageStartfile
# due to your Sage-installation!
#
identifier: sagetex
name: SageTeX
authors:
- TeXnician (Author)
- cis (Idea)
arguments: []
commands:
- name: A SageTeX Rule for arara
  command: >
    @{
        pathToBashExecutive = "C:\\Programme\\SageMath8.9\\runtime\\bin\\bash";
        pathToSageStartfile = "C:/Programme/SageMath8.9/runtime/opt/sagemath-8.9/sage";
        pathOfCurrentWorkingFolder = currentFile().getParent();
        theWindowsCommand = getCommand(pathToBashExecutive, "-l", pathToSageStartfile, "-c", "os.chdir('" + pathOfCurrentWorkingFolder + "'); load('" + getBasename(currentFile()) + ".sagetex.sage')");
        return isWindows(theWindowsCommand, getCommand("sage", getBasename(file) + ".sagetex.sage"));
       }


Das ergibt dann das Dokument
latex
% arara: pdflatex
% arara: sagetex
% arara: pdflatex
 
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
 
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
 
\usepackage{sagetex}
\begin{document}
\section{Eingangsdaten}
\begin{sageblock}
n = 2000
p = 0.2
\end{sageblock}
 
\section{Graph mit Sage}
\begin{sageblock}
import scipy.stats
binom_dist = scipy.stats.binom(n,p)
Layout = dict(frame=False, axes_labels=['$k$','$B(k,{},{})$'.format(n,float(p))])
\end{sageblock}
\sageplot[width=.5\textwidth]{
bar_chart([binom_dist.pmf(x) for x in range(n)],  **Layout)   }
 
\section{Daten mit Sage, Graph mit pgfplots}
\begin{sageblock}
data = [(k,binom_dist.pmf(k)) for k in range(n)]
pattern = "{:5}, {:15}"
out_str = '\n'.join([pattern.format(*tup) for tup in data])
#print(out_str)
 
def save_string(path, string, mode='w'):
    with open(path, mode) as file:
        file.write(string)
 
save_string('data.txt', out_str) 
\end{sageblock}
 
\begin{tikzpicture}[font=\footnotesize]
\begin{axis}[
axis lines=middle, 
axis line style = {-latex},
scaled y ticks=false, 
y tick label style={
/pgf/number format/.cd,fixed, fixed zerofill, precision=3,/tikz/.cd},
x tick label style={
/pgf/number format/.cd,1000 sep={}},
enlarge x limits={rel=0.1,upper},
enlarge y limits={rel=0.1,upper},
xlabel={$k$},
xlabel style={anchor=north west, inner sep=1pt},
ylabel={$B(k,\sage{n},\sage{float(p)})$},
ylabel style={anchor=east, inner sep=1pt},
]
\addplot[ybar,
bar width=0.1,
draw=none, thin, fill=blue!50, 
] table [col sep=comma, y index=1] {data.txt};
% Hüllkurve
\addplot[draw=blue, fill=none, smooth] table [col sep=comma, y index=1] {data.txt};
\end{axis} 
\end{tikzpicture}
\end{document}


das auch eine optionale reine Sage-Umsetzung des Graphen enthält.





 


MrTikZ
Aktiv
Dabei seit: 22.03.2020
Mitteilungen: 46
Herkunft:
 Beitrag No.4, eingetragen 2020-04-05 13:20    [Diesen Beitrag zitieren]

2020-04-05 08:25 - AnjaSTG in Beitrag No. 2 schreibt:
Gibt es eine Möglichkeit, Histogramme von Binomialverteilungen mit N=2000 plotten zu lassen?

psTricks ist so alt, dass jmd. mal ein Macro für diese Funktion geschrieben hat.

Für das neuere pgfplots wüsste ich sowas nicht, man kann es sich aber basteln.

Hinweis: Hier musste getrickst werden, denn wenn man die Samples über den vollen Bereich k=0,1,2,...,2000  zeichnet, rechnet er sehr lange.

Einen -automatischen- sinnvollen Zeichenbereich für verschiedene Werte n konnte ich jetzt auf die Schnelle nicht ersinnen. Geht bestimmt (als Quartil oder sowas).


Ansonsten sei darauf hingeweisen, dass es vermutlich sinnvoller ist, eine Rohdatentabelle, etwa "Binomal.2000.0.2.txt" mit Mathematica / Sage / ... zu erstellen und diese dann mit pgfplots als table-plot einzulesen; da LaTeX nunmal kein echtes CAS ist.
Wahlweise könnte man auch SageTeX verwenden.


<math>
\begin{tikzpicture}[
declare function={binom(\k,\n,\p)=\n!/(\k!*(\n-\k)!)*\p^\k*(1-\p)^(\n-\k);},
background rectangle/.style={draw=none, fill=black!1, rounded corners}, show background rectangle,
]
\pgfmathsetmacro\n{2000}
\pgfmathsetmacro\p{0.2}

\pgfmathsetmacro\Major{500} % Unterteilung x-Achse
\pgfmathsetmacro\Minor{100}
\pgfmathsetmacro\Expectedvalue{\n*\p}
\pgfmathsetmacro\v{0.15} % eintragen! ===============
% "gut:"   ca. v=0.125 bei n=2000; ca. v=0.5 bei n=200
\pgfmathsetmacro\SamplesMin{int(\Expectedvalue-\v*\Expectedvalue)}
\pgfmathsetmacro\SamplesMax{int(\Expectedvalue+\v*\Expectedvalue)}
\begin{axis}[
samples at={\SamplesMin,...,\SamplesMax},
axis lines=middle,
axis line style = {-latex},
%ymin=0,
xmin=0, xmax=\n,
xtick={0,\Major,...,\n},
xticklabels={0,\Major,...,\n},
minor xtick={0,\Minor,...,\n},
extra x ticks={0}, % Origo
scaled y ticks=false,
y tick label style={
/pgf/number format/.cd,
fixed, fixed zerofill, precision=3,
/tikz/.cd},
enlarge x limits={rel=0.1,upper},
enlarge y limits={rel=0.1,upper},
%ybar=0pt, bar width=3,
xlabel={$k$},
xlabel style={anchor=north west, inner sep=1pt},
ylabel={$B(k,\n,\p)$},
ylabel style={anchor=east, inner sep=1pt},
]
\addplot [draw=cyan, fill=cyan] {binom(x,\n,\p)};
\addlegendentry{$p=0.2$}
\end{axis}
\node[anchor=north, align=left] at (0,-1){
Erwartungswert: \Expectedvalue \\
SamplesMin: \SamplesMin  \\
SamplesMax: \SamplesMax \\
v=\v
};
\end{tikzpicture}
</math>
latex
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.7}
 
\begin{document}
\begin{tikzpicture}[
declare function={binom(\k,\n,\p)=\n!/(\k!*(\n-\k)!)*\p^\k*(1-\p)^(\n-\k);},
]
\pgfmathsetmacro\n{2000}
\pgfmathsetmacro\p{0.2}
\pgfmathsetmacro\v{0.15} % eintragen! ===============
% "gut:"   ca. v=0.15 bei n=2000; ca. v=0.5 bei n=200
 
\pgfmathsetmacro\Major{500} % Unterteilung x-Achse
\pgfmathsetmacro\Minor{100}
 
\pgfmathsetmacro\Expectedvalue{\n*\p}
\pgfmathsetmacro\SamplesMin{int(\Expectedvalue-\v*\Expectedvalue)}
\pgfmathsetmacro\SamplesMax{int(\Expectedvalue+\v*\Expectedvalue)}
\begin{axis}[
samples at={\SamplesMin,...,\SamplesMax},
axis lines=middle, 
axis line style = {-latex},
%ymin=0, 
xmin=0, xmax=\n,
xtick={0,\Major,...,\n},
xticklabels={0,\Major,...,\n},
minor xtick={0,\Minor,...,\n},
extra x ticks={0}, % Origo
scaled y ticks=false, 
y tick label style={
/pgf/number format/.cd,
fixed, fixed zerofill, precision=3,
/tikz/.cd},
enlarge x limits={rel=0.1,upper},
enlarge y limits={rel=0.1,upper},
%ybar=0pt, bar width=3,
xlabel={$k$},
xlabel style={anchor=north west, inner sep=1pt},
ylabel={$B(k,\n,\p)$},
ylabel style={anchor=east, inner sep=1pt},
]
\addplot[draw=cyan, fill=cyan] {binom(x,\n,\p)}; 
   \addlegendentry{$p=\p$}
\end{axis}
\node[anchor=north, align=left] at (0,-1){
Erwartungswert: \Expectedvalue \\
SamplesMin: \SamplesMin  \\
SamplesMax: \SamplesMax \\ 
v=\v
};
\end{tikzpicture}
\end{document} 



[Die Antwort wurde nach Beitrag No.2 begonnen.]


occhio
Aktiv
Dabei seit: 06.11.2007
Mitteilungen: 548
Herkunft: NRW
 Beitrag No.3, eingetragen 2020-04-05 11:19    [Diesen Beitrag zitieren]

Hi,
nach ein bisschen Spielen an den Skalierschrauben Dy, Dx usw. habe ich es hinbekommen für N=2000. Ob der Erwartungswert (0.20) dann so stimmt, weiß ich nicht (dafür bin ich in der Mathematik zu wenig zuhause).

Das PDF habe ich im Querformat eingestellt, damit man überhaupt etwas sieht und muss es dann noch ganz schön groß ziehen.

Den Code habe ich gem. eines anderen Beispiels der Doku entnommen und abgeändert. Unten einmal mein gesamtes Dokument, die Minipages dienen lediglich einer netteren Aufteilung.
LaTeX
\documentclass{book}
\usepackage{pstricks}
\usepackage{pst-plot}
\usepackage{pst-func}
\usepackage{pstricks-add}
%
\usepackage[
left=1cm, % linker Rand
right=1cm, % rechter Rand
top=2.5cm, % oberer Rand
bottom=2.5cm, % unterer Rand
landscape, % Querformat
]{geometry}
%
%%%%
%
\begin{document}
 
%% Syntax für n 3<k<9 andere Farbe 
%
%\psBinomial[Optionen]{m,n,N}{p}
%
% 
 
\begin{minipage}[c][6cm]{0.9\textwidth}
\begin{psgraph}[%
dx=5,Dx=5,dy=.1,Dy=.1,
xAxisLabel=k,%Abszisse
yAxisLabel={},%Ordinate
yticksize=-0.3 30,
%ticklinestyle=dashed
]{->}(0,0)(-1,0)(30,0.3){8cm}{6cm}
\psBinomial[markZeros,fillstyle=solid,fillcolor=blue!10,barwidth=0.5]{30}{0.2}
\psBinomial[markZeros,fillstyle=solid,fillcolor=red,barwidth=0.5]{4,8,30}{0.2}
\end{psgraph}
\end{minipage}
 
\vspace{1cm}
 
\begin{minipage}[c][6cm]{0.9\textwidth}
\psset{xunit=0.01cm,yunit=10cm}%
\begin{pspicture}(-1,-0.05)(2000,0.6)%
\psaxes[Dy=0.1,dy=0.1\psyunit,Dx=100,dx=100\psxunit]{->}(0,0)(0,0)(2100,0.5)
\uput[-90](2150,0){$k$}
\psBinomial[linecolor=blue,markZeros,fillstyle=solid,fillcolor=blue,barwidth=0.5]{2000}{0.2}
\end{pspicture}
\end{minipage}
 
\end{document}

Sollten keine Fragen mehr auftauchen, zwei Bitten: stelle einmal das Endergebnis ein und hake das Thema ab.

lG occhio

PS: Doku zum pst-func-Paket s. hier auf CTAN.


AnjaSTG
Neu
Dabei seit: 03.04.2020
Mitteilungen: 2
Herkunft:
 Beitrag No.2, eingetragen 2020-04-05 08:25    [Diesen Beitrag zitieren]

Hallo occhio!

Vielen Dank! Das hat super geklappt!

Gibt es eine Möglichkeit, Histogramme von Binomialverteilungen mit N=2000 plotten zu lassen?

LG AnjaSTG


occhio
Aktiv
Dabei seit: 06.11.2007
Mitteilungen: 548
Herkunft: NRW
 Beitrag No.1, eingetragen 2020-04-04 20:34    [Diesen Beitrag zitieren]

Hi AnjaSTG,

herzlich Willkommen auf dem Planeten!

Laut Doku zu dem Paket pst-func gibt es drei Einstellmöglichkeiten:
  • with one argument N the sequence 0...N is calculated and plotted
  • with two arguments m, N the sequence 0...N is calculated and the sequence m...N is plotted
  • with three arguments m, n, N the sequence 0...N is calculated and the sequence m...n is plotted
LaTeX
\documentclass{book}
\usepackage{pstricks}
\usepackage{pst-plot}
\usepackage{pst-func}
\usepackage{pstricks-add}
%
%%%%
%
\begin{document}
%
%% Syntax andere Farbe für n 3<k<9 
%
%\psBinomial[Optionen]{m,n,N}{p}
%
\begin{psgraph}[%
dx=5,Dx=5,dy=.1,Dy=.1,
xAxisLabel=k,%Abszisse
yAxisLabel={},%Ordinate
yticksize=-0.3 30,
%ticklinestyle=dashed
]{->}(0,0)(-1,0)(30,0.3){8cm}{6cm}
\psBinomial[markZeros,fillstyle=solid,fillcolor=blue!10,barwidth=0.5]{30}{0.2}
\psBinomial[markZeros,fillstyle=solid,fillcolor=red,barwidth=0.5]{4,8,30}{0.2}
\end{psgraph}
%
\end{document}

Zur Verdeutlichung habe ich die Balkenbreite (barwidth) reduziert.

lG occhio




AnjaSTG
Neu
Dabei seit: 03.04.2020
Mitteilungen: 2
Herkunft:
 Themenstart: 2020-04-03 10:41    [Diesen Beitrag zitieren]

Hallo liebe Matheplanetarier !

Ich möchte mit dem Befehl \psBinomial eine Binomialverteilung für n=30 und p=0,2 zeichnen. Außerdem würde ich gerne die Balken für 3<k<9 in einer anderen Farbe einfärben. Wie kann ich dies erreichen?
MfG
AnjaSTG



\documentclass[]{book}
\usepackage{pstricks}
\usepackage{pst-plot}
\usepackage{pst-func}
\usepackage{pstricks-add}
\begin{document}
 
\begin{psgraph}[dx=5,Dx=5,dy=.1,Dy=.1,
xAxisLabel=$k$,%Abszisse
yAxisLabel={},%Ordinate
yticksize=-0.3 30
%ticklinestyle=dashed
]{->}(0,0)(-1,0)(30,.3){8cm}{6cm}
\psBinomial[markZeros,fillstyle=solid,fillcolor=blue!10]{30}{0.2}
\end{psgraph}
 
\end{document}


 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]