Matroids Matheplanet Forum Index
Moderiert von Stefan_K
Matroids Matheplanet Forum Index » Textsatz mit LaTeX » einzelne Histogrammbalken einfärben
Druckversion
Druckversion
Antworten
Antworten
Autor
Schule einzelne Histogrammbalken einfärben
AnjaSTG
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 03.04.2020
Mitteilungen: 2
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-04-03


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}



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
occhio
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 06.11.2007
Mitteilungen: 548
Aus: NRW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-04-04


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





Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
AnjaSTG
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 03.04.2020
Mitteilungen: 2
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-04-05


Hallo occhio!

Vielen Dank! Das hat super geklappt!

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

LG AnjaSTG



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
occhio
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 06.11.2007
Mitteilungen: 548
Aus: NRW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-04-05


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.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
MrTikZ
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 22.03.2020
Mitteilungen: 53
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2020-04-05


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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
MrTikZ
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 22.03.2020
Mitteilungen: 53
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2020-04-06


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.





 



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
AnjaSTG hat die Antworten auf ihre/seine Frage gesehen.
AnjaSTG hatte hier bereits selbst das Ok-Häkchen gesetzt.
AnjaSTG wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
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]