Forum:  Textsatz mit LaTeX
Thema: einzelne Histogrammbalken einfärben
Themen-Übersicht
AnjaSTG
Neu
Dabei seit: 03.04.2020
Mitteilungen: 2
Aus:
Themenstart: 2020-04-03 10:41

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}


occhio
Aktiv
Dabei seit: 06.11.2007
Mitteilungen: 548
Aus: NRW
Beitrag No.1, eingetragen 2020-04-04 20:34

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
Aus:
Beitrag No.2, vom Themenstarter, eingetragen 2020-04-05 08:25

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
Aus: NRW
Beitrag No.3, eingetragen 2020-04-05 11:19

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.


MrTikZ
Aktiv
Dabei seit: 22.03.2020
Mitteilungen: 46
Aus:
Beitrag No.4, eingetragen 2020-04-05 13:20

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.]


MrTikZ
Aktiv
Dabei seit: 22.03.2020
Mitteilungen: 46
Aus:
Beitrag No.5, eingetragen 2020-04-06 13:47

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.





 




Dieses Forumbeitrag kommt von Matroids Matheplanet
https://https://matheplanet.de

Die URL für dieses Forum-Thema ist:
https://https://matheplanet.de/default3.html?topic=246569=409
Druckdatum: 2020-07-06 18:21