moving and some work

This commit is contained in:
2015-10-27 23:24:04 +01:00
parent 1556c96037
commit 96997a8299
5 changed files with 59 additions and 6 deletions

View File

@@ -1,198 +0,0 @@
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as spio
import scipy as sp
import seaborn as sb
from IPython import embed
sb.set_context("paper")
def set_axis_fontsize(axis, label_size, tick_label_size=None, legend_size=None):
"""
Sets axis, tick label and legend font sizes to the desired size.
:param axis: the axes object
:param label_size: the size of the axis label
:param tick_label_size: the size of the tick labels. If None, lable_size is used
:param legend_size: the size of the font used in the legend.If None, the label_size is used.
"""
if not tick_label_size:
tick_label_size = label_size
if not legend_size:
legend_size = label_size
axis.xaxis.get_label().set_fontsize(label_size)
axis.yaxis.get_label().set_fontsize(label_size)
for tick in axis.xaxis.get_major_ticks() + axis.yaxis.get_major_ticks():
tick.label.set_fontsize(tick_label_size)
l = axis.get_legend()
if l:
for t in l.get_texts():
t.set_fontsize(legend_size)
def get_instantaneous_rate(times, max_t=30., dt=1e-4):
time = np.arange(0., max_t, dt)
indices = np.asarray(times / dt, dtype=int)
intervals = np.diff(np.hstack(([0], times)))
inst_rate = np.zeros(time.shape)
for i, index in enumerate(indices[1:]):
inst_rate[indices[i-1]:indices[i]] = 1/intervals[i]
return time, inst_rate
def plot_isi_rate(spike_times, max_t=30, dt=1e-4):
times = np.squeeze(spike_times[0][0])[:50000]
time, rate = get_instantaneous_rate(times, max_t=50000*dt)
rates = np.zeros((len(rate), len(spike_times)))
for i in range(len(spike_times)):
_, rates[:, i] = get_instantaneous_rate(np.squeeze(spike_times[i][0])[:50000],
max_t=50000*dt)
avg_rate = np.mean(rates, axis=1)
rate_std = np.std(rates, axis=1)
fig = plt.figure()
ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(312)
ax3 = fig.add_subplot(313)
ax1.vlines(times[times < (50000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5)
ax1.set_ylabel("skpikes", fontsize=12)
set_axis_fontsize(ax1, 12)
ax2.plot(time, rate, label="instantaneous rate, trial 1")
ax2.set_ylabel("firing rate [Hz]", fontsize=12)
ax2.legend(fontsize=12)
set_axis_fontsize(ax2, 12)
ax3.fill_between(time, avg_rate+rate_std, avg_rate-rate_std, color="dodgerblue",
alpha=0.5, label="standard deviation")
ax3.plot(time, avg_rate, label="average rate")
ax3.set_xlabel("times [s]", fontsize=12)
ax3.set_ylabel("firing rate [Hz]", fontsize=12)
ax3.legend(fontsize=12)
ax3.set_ylim([0, 450])
set_axis_fontsize(ax3, 12)
fig.set_size_inches(15, 10)
fig.subplots_adjust(left=0.1, bottom=0.125, top=0.95, right=0.95)
fig.set_facecolor("white")
fig.savefig("../lectures/images/instantaneous_rate.png")
plt.close()
def get_binned_rate(times, bin_width=0.05, max_t=30., dt=1e-4):
time = np.arange(0., max_t, dt)
bins = np.arange(0., max_t, bin_width)
bin_indices = bins / dt
hist, _ = sp.histogram(times, bins)
rate = np.zeros(time.shape)
for i, b in enumerate(bin_indices[1:]):
rate[bin_indices[i-1]:b] = hist[i-1]/bin_width
return time, rate
def plot_bin_rate(spike_times, bin_width, max_t=30, dt=1e-4):
times = np.squeeze(spike_times[0][0])
time, rate = get_binned_rate(times)
rates = np.zeros((len(rate), len(spike_times)))
for i in range(len(spike_times)):
_, rates[:, i] = get_binned_rate(np.squeeze(spike_times[i][0]))
avg_rate = np.mean(rates, axis=1)
rate_std = np.std(rates, axis=1)
fig = plt.figure()
ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(312)
ax3 = fig.add_subplot(313)
ax1.vlines(times[times < (100000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5)
ax1.set_ylabel("skpikes", fontsize=12)
ax1.set_xlim([0, 5])
set_axis_fontsize(ax1, 12)
ax2.plot(time, rate, label="binned rate, trial 1")
ax2.set_ylabel("firing rate [Hz]", fontsize=12)
ax2.legend(fontsize=12)
ax2.set_xlim([0, 5])
set_axis_fontsize(ax2, 12)
ax3.fill_between(time, avg_rate+rate_std, avg_rate-rate_std, color="dodgerblue",
alpha=0.5, label="standard deviation")
ax3.plot(time, avg_rate, label="average rate")
ax3.set_xlabel("times [s]", fontsize=12)
ax3.set_ylabel("firing rate [Hz]", fontsize=12)
ax3.legend(fontsize=12)
ax3.set_xlim([0, 5])
ax3.set_ylim([0, 450])
set_axis_fontsize(ax3, 12)
fig.set_size_inches(15, 10)
fig.subplots_adjust(left=0.1, bottom=0.125, top=0.95, right=0.95)
fig.set_facecolor("white")
fig.savefig("../lectures/images/binned_rate.png")
plt.close()
def get_convolved_rate(times, sigma, max_t=30., dt=1.e-4):
time = np.arange(0., max_t, dt)
kernel = sp.stats.norm.pdf(np.arange(-8*sigma, 8*sigma, dt),loc=0,scale=sigma)
indices = np.asarray(times/dt, dtype=int)
rate = np.zeros(time.shape)
rate[indices] = 1.;
conv_rate = np.convolve(rate, kernel, mode="same")
return time, conv_rate
def plot_conv_rate(spike_times, sigma=0.05, max_t=30, dt=1e-4):
times = np.squeeze(spike_times[0][0])
time, rate = get_convolved_rate(times, sigma)
rates = np.zeros((len(rate), len(spike_times)))
for i in range(len(spike_times)):
_, rates[:, i] = get_convolved_rate(np.squeeze(spike_times[i][0]), sigma)
avg_rate = np.mean(rates, axis=1)
rate_std = np.std(rates, axis=1)
fig = plt.figure()
ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(312)
ax3 = fig.add_subplot(313)
ax1.vlines(times[times < (100000*dt)], ymin=0, ymax=1, color="dodgerblue", lw=1.5)
ax1.set_ylabel("skpikes", fontsize=12)
ax1.set_xlim([0, 5])
set_axis_fontsize(ax1, 12)
ax2.plot(time, rate, label="convolved rate, trial 1")
ax2.set_ylabel("firing rate [Hz]", fontsize=12)
ax2.legend(fontsize=12)
ax2.set_xlim([0, 5])
set_axis_fontsize(ax2, 12)
ax3.fill_between(time, avg_rate+rate_std, avg_rate-rate_std, color="dodgerblue",
alpha=0.5, label="standard deviation")
ax3.plot(time, avg_rate, label="average rate")
ax3.set_xlabel("times [s]", fontsize=12)
ax3.set_ylabel("firing rate [Hz]", fontsize=12)
ax3.legend(fontsize=12)
ax3.set_xlim([0, 5])
ax3.set_ylim([0, 450])
set_axis_fontsize(ax3, 12)
fig.set_size_inches(15, 10)
fig.subplots_adjust(left=0.1, bottom=0.125, top=0.95, right=0.95)
fig.set_facecolor("white")
fig.savefig("../lectures/images/convolved_rate.png")
plt.close()
if __name__ == "__main__":
spike_times = spio.loadmat('lifoustim.mat')["spikes"]
plot_isi_rate(spike_times)
plot_bin_rate(spike_times, 0.05)
plot_conv_rate(spike_times, 0.025)

View File

@@ -1,78 +0,0 @@
\documentclass[12pt,a4paper,pdftex]{exam}
\usepackage[german]{babel}
\usepackage{natbib}
\usepackage{graphicx}
\usepackage[small]{caption}
\usepackage{sidecap}
\usepackage{pslatex}
\usepackage{amsmath}
\usepackage{amssymb}
\setlength{\marginparwidth}{2cm}
\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref}
%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
\pagestyle{headandfoot} \header{{\bfseries\large \"Ubung
}}{{\bfseries\large Peri Stimulus Time Histogram}}{{\bfseries\large 28. Oktober, 2015}}
\firstpagefooter{Dr. Jan Grewe}{Phone: 29 74588}{Email:
jan.grewe@uni-tuebingen.de} \runningfooter{}{\thepage}{}
\setlength{\baselineskip}{15pt}
\setlength{\parindent}{0.0cm}
\setlength{\parskip}{0.3cm}
\renewcommand{\baselinestretch}{1.15}
\newcommand{\code}[1]{\texttt{#1}}
\renewcommand{\solutiontitle}{\noindent\textbf{L\"osung:}\par\noindent}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\vspace*{-6.5ex}
\begin{center}
\textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex]
{\large Jan Grewe, Jan Benda}\\[-3ex]
Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
\end{center}
\begin{questions}
\question Graphische Darstellung der zeitabh\"angigen Antwort eines
Neurons. PSTH auf Basis der instantanen Feuerrate. Verwendet den Datensatz \code{}
\begin{parts}
\part Schreibt eine Funktion, die einen Vektor mit Spikezeiten,
die Dauer des Trials, und die zeitliche Aufl\"osung entgegennimmt
und die Zeitachse sowie die Feuerrate zur\"uckgiebt.
\part Benutzt diese Funktion in einem Skript und stellt das PSTH
eines einzelnen Trials sowie den Mittelwert \"uber alle Trials
dar.
\part Erweitert das Programm so, dass die Abbildung den Standards
z.B. vom \textit{Journal of Neuroscience} entspricht
(Schriftgr\"o{\ss}e, Abbildungsgr\"o{\ss}e).
\part Die Abbildung sollte als pdf gespeichert werden.
\end{parts}
\question Wie zuvor nur unter Verwendung der Binning Methode.
\question Wie zuvor nur unter Verwendung der Faltungsmethode.
\question Entscheidet euch f\"ur eine Varainte und erweitert das
entsprechende Skript, sodass auch die Interspikeintervallverteilung
und die Verteilung der Spikecounts dargestellt werden. Die
Abbildungen sollten nat\"urlich ``publikationsreif'' sein und
gespeichert werden.
\question Einige trials sind anders als die \"Ubrigen. Benutzt den
Rasterplot um sie zu finden. Speichert alle Abbildungen in
``publikationsreifer'' Form.
\begin{parts}
\part Benutzt den Rasterplot um sie zu finden.
\part Plottet die Verteilung der Spike counts.
\part Filtert all die trials heraus, deren spike count mehr als
$2\sigma$ vom Mittelwert abweicht.
\part Plottet das PSTH vor und nach dem Filtern.
\end{parts}
\end{questions}
\end{document}

View File

@@ -1,5 +1,5 @@
TEXFILES=$(wildcard *.tex)
TEXFILES=boolean_logical_indexing.tex control_structures.tex data_structures.tex plotting_spike_trains.tex programming_basics.tex scripts_functions.tex sta_stc.tex variables_datatypes.tex vectors_matrices.tex
TEXFILES=boolean_logical_indexing.tex control_structures.tex data_structures.tex plotting.tex programming_basics.tex scripts_functions.tex sta_stc.tex variables_datatypes.tex vectors_matrices.tex
PDFFILES=$(TEXFILES:.tex=.pdf)

View File

@@ -0,0 +1,358 @@
\documentclass{beamer}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{pgf}
%\usepackage{pgf,pgfarrows,pgfnodes,pgfautomata,pgfheaps,pgfshade}
%\usepackage{multimedia}
\usepackage[english]{babel}
\usepackage{movie15}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage{amsmath}
\usepackage{bm}
\usepackage[T1]{fontenc}
\usepackage[scaled=.90]{helvet}
\usepackage{scalefnt}
\usepackage{tikz}
\usepackage{ textcomp }
\usepackage{soul}
\usepackage{hyperref}
\definecolor{lightblue}{rgb}{.7,.7,1.}
\definecolor{mygreen}{rgb}{0,1.,0}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\mode<presentation>
{
\usetheme{Singapore}
\setbeamercovered{opaque}
\usecolortheme{tuebingen}
\setbeamertemplate{navigation symbols}{}
\usefonttheme{default}
\useoutertheme{infolines}
% \useoutertheme{miniframes}
}
\AtBeginSection[]
{
\begin{frame}<beamer>
\begin{center}
\Huge \insertsectionhead
\end{center}
% \frametitle{\insertsectionhead}
% \tableofcontents[currentsection,hideothersubsections]
\end{frame}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
\setbeamertemplate{blocks}[rounded][shadow=true]
\title[]{Scientific Computing -- Grundlagen der Programmierung }
\author[]{Jan Grewe\\Abteilung f\"ur Neuroethologie\\
Universit\"at T\"ubingen}
\institute[Wissenschaftliche Datenverarbeitung]{}
\date{12.10.2015 - 06.11.2015}
%\logo{\pgfuseimage{../../resources/UT_BM_Rot_RGB.pdf}}
\subject{Einf\"uhrung in die wissenschaftliche Datenverarbeitung}
\vspace{1em}
\titlegraphic{
\includegraphics[width=0.5\linewidth]{../../resources/UT_WBMW_Rot_RGB}
}
%%%%%%%%%% configuration for code
\lstset{
basicstyle=\ttfamily,
numbers=left,
showstringspaces=false,
language=Matlab,
commentstyle=\itshape\color{darkgray},
keywordstyle=\color{blue},
stringstyle=\color{green},
backgroundcolor=\color{blue!10},
breaklines=true,
breakautoindent=true,
columns=flexible,
frame=single,
captionpos=b,
xleftmargin=1em,
xrightmargin=1em,
aboveskip=10pt
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\mycite}[1]{
\begin{flushright}
\tiny \color{black!80} #1
\end{flushright}
}
\newcommand{\code}[1]{\texttt{#1}}
\input{../../latex/environments.tex}
\makeatother
\begin{document}
\begin{frame}[plain]
\frametitle{}
\vspace{-1cm}
\titlepage % erzeugt Titelseite
\end{frame}
\begin{frame}
\frametitle{Grundlagen der Programmierung}
\frametitle{Inhalt}
\begin{enumerate}
\item Graphische Darstellung von Daten
\end{enumerate}
\end{frame}
\begin{frame}[plain]
\huge{1. Graphische Darstellung von Daten}\pause
\begin{figure}
\includegraphics[width=0.9\columnwidth]{images/convincing}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Was soll ein Datenplot erreichen?}
\begin{itemize}
\item Ist eine m\"oglichst neutrale Darstellung der Daten.
\item Soll dem Leser die Daten greifbar machen und die Aussagen der
Analyse darstellen.
\item Erlaubt dem Leser die gezeigten Effekte selbst zu beguachten
und zu validieren.
\item Muss vollst\"andig annotiert sein.
\item Folgt dem Prinzip der \textbf{ink minimization}. (Das
Verh\"altnis aus Tinte, die f\"ur die Darstellung der Daten
gebraucht wird und der Menge Tinte, die f\"ur die Graphik
ben\"otigt wird sollte m\"oglichst gro{\ss} sein )
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Was sollte vermieden werden?}
\begin{itemize}
\item Suggestive oder gar fehlleitende Darstellung.
\item Ablenkung durch unruhige oder \"uberm\"a{\ss}ige Effekte.
\item Comicartige Effekte...
\end{itemize}\pause
\begin{figure}
\includegraphics[width=0.35\columnwidth]{images/one_d_problem_c}
\end{figure}\pause
... aus{\ss}er sie werden rein zur Illustration benutzt ohne einen
Anspruch auf Richtigkeit zu erheben.
\end{frame}
\begin{frame}
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Suboptimale Beispiele}
\only <1> {
\begin{figure}
\includegraphics[width=0.5\columnwidth]{images/nobelbad}
\end{figure}
\vspace{0.25cm}
Aus Hafting et al., Nature, 2005
}
\only <2> {
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/misleading_pie}
\end{figure}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\only <3> {
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/sample_pie}
\end{figure}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\only <4> {
\begin{figure}
\includegraphics[width=0.3\columnwidth]{images/badbarright}
\end{figure}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\only <5> {
\begin{figure}
\includegraphics[width=0.3\columnwidth]{images/badbarleft}
\end{figure}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\only <6> {
\begin{figure}
\includegraphics[width=0.8\columnwidth]{images/badbarplot}
\end{figure}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\only <7> {
Wahl der Zeichenfl\"ache kann den visuellen Eindruck beeinflu{\ss}en.
\begin{columns}
\begin{column}{4.cm}
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/line_graph1}
\end{figure}
\end{column}
\begin{column}{4.cm}
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/line_graph1_3}
\end{figure}
\end{column}
\begin{column}{4.cm}
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/line_graph1_4}
\end{figure}
\end{column}
\end{columns}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\only <8> {
Vorsicht bei der Skalierung von Symbolen!
\begin{columns}
\begin{column}{4.cm}
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/improperly_scaled_graph}
\end{figure}
\end{column}
\begin{column}{4.cm}
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/properly_scaled_graph}
\end{figure}
\end{column}
\begin{column}{4.cm}
\begin{figure}
\includegraphics[width=0.7\columnwidth]{images/comparison_properly_improperly_graph}
\end{figure}
\end{column}
\end{columns}
\vspace{0.5cm}
\url{https://en.wikipedia.org/wiki/Misleading_graph}
}
\end{frame}
\begin{frame}[fragile]
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Plotting Interfaces in Matlab}
Es gibt zwei Wege Graphen zu bearbeiten:
\begin{enumerate}
\item Interaktiv \"uber das \textit{graphische User Interface}\pause
\item Die Kommandozeile bzw. in Skripten und Funktionen.\pause
\end{enumerate}
Beides hat seine Berechtigung und seine eigenen Vor- und Nachteile. Welche?
\end{frame}
\begin{frame}
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Ver\"anderung des Graphen \"uber die Kommandozeile}
\begin{itemize}
\item Erstellt ein Skript, dass einen Plot erstellt.
\item Dieser soll zwei Sinus unterschiedlicher Frequenz darstellen.
\end{itemize}
Wir werden jetzt die Kommandozeil bzw. das Skript verbessern um den
Plot ``sch\"oner'' zu machen.
\end{frame}
\begin{frame}
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Ver\"anderung des Graphen \"uber die Kommandozeile}
\begin{enumerate}
\item Einstellungen der Linienplots:
\begin{itemize}
\item St\"arke und Farbe.
\item Linienstil, Marker.
\end{itemize}\pause
\item Achsbeschriftung:
\begin{itemize}
\item \code{xlabel}, \code{ylabel}.
\item Schriftart und Gr\"o{\ss}e.
\end{itemize}\pause
\item Achsenskalierung und Ticks:
\begin{itemize}
\item Skalierung der Achsen (Minumum und Maxmimum, logarithmisch oder linear).
\item Manuelles Setzen der Ticks, ihrer Richtung und Beschriftung.
\item Grid or no Grid?
\end{itemize}\pause
\item Setzen von globalen Parametern:
\begin{itemize}
\item Einstellung der Papiergr\"o{\ss}e und plzieren der
Zeichenfl\"ache.
\item Box oder nicht?
\item Speichern der Abbildung als pdf.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame} [fragile]
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Ver\"andern von Eigenschaften \"uber die Kommandozeile}
\vspace{-0.75em}
\scriptsize
\begin{lstlisting}
fig = figure();
set(gcf, 'PaperUnits', 'centimeters', 'PaperSize', [11.7 9.0]);
set(gcf, 'PaperPosition',[0.0 0.0 11.7 9.0], 'Color', 'white')
hold on
plot(time, neuronal_data, 'color', [ 0.2 0.5 0.7], 'linewidth', 1.)
plot(spike_times, ones(size(spike_times))*threshold, 'ro', 'markersize', 4)
line([time(1) time(end)], [threshold threshold], 'linestyle', '--',
'linewidth', 0.75, 'color', [0.9 0.9 0.9])
ylim([0 35])
xlim([0 2.25])
box('off')
xlabel('time [s]', 'fontname', 'MyriadPro-Regular', 'fontsize', 10)
ylabel('potential [mV]', 'fontname', 'MyriadPro-Regular', 'fontsize', 10)
title('pyramidal cell', 'fontname', 'MyriadPro-Regular', 'fontsize', 12)
set(gca, 'TickDir','out', 'linewidth', 1.5, 'fontname', 'MyriadPro-Regular')
saveas(fig, 'spike_detection.pdf', 'pdf')
\end{lstlisting}
\end{frame}
\begin{frame} [fragile]
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Ver\"andern von Eigenschaften \"uber die Kommandozeile}
\begin{figure}
\centering
\includegraphics[width=0.75\columnwidth]{./images/spike_detection}
\end{figure}
\end{frame}
\begin{frame} [fragile]
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Welche Art Plot wof\"ur?}
\url{http://www.mathworks.de/discovery/gallery.html}
\end{frame}
\begin{frame} [fragile]
\frametitle{Graphische Darstellung von Daten}
\framesubtitle{Was macht einen guten Abbildung aus?}
\begin{enumerate}
\item Klarheit.
\item Vollstaendige Beschriftung.
\item Deutliche Unterscheidbarkeit von Kurven.
\item Keine suggestive Darstellung.
\item Ausgewogenheit von Linienst\"arken Schrift- und Plotgr\"o{\ss}e.
\item Fehlerbalken, wenn sie angebracht sind.
\end{enumerate}
\end{frame}
\end{document}