Overhauling everything a bit, but at least it starts to be working...

This commit is contained in:
tschan_d committed 2026-07-03 17:32:39 +02:00
1 parent abdf25447c
commit 97b7df338e
5 files changed
+1200 -98

No files matched your search

+864
View File
@@ -0,0 +1,864 @@
# Overall figure
axes.facecolor: white # axes background color
axes.edgecolor: black # axes edge color
axes.linewidth: 0.8 # edge line width
axes.grid: True # display grid or not
axes.grid.axis: both # which axis the grid should apply to
axes.grid.which: both # grid lines at {major, minor, both} ticks
grid.linewidth: 0.2
grid.color: black
xtick.top:True
ytick.right:True
#### MATPLOTLIBRC FORMAT
## DO NOT EDIT THIS FILE, MAKE A COPY FIRST
##
## This is a sample Matplotlib configuration file - you can find a copy
## of it on your system in site-packages/matplotlib/mpl-data/matplotlibrc
## (relative to your Python installation location).
## DO NOT EDIT IT!
##
## If you wish to change your default style, copy this file to one of the
## following locations:
## Unix/Linux:
## $HOME/.config/matplotlib/matplotlibrc OR
## $XDG_CONFIG_HOME/matplotlib/matplotlibrc (if $XDG_CONFIG_HOME is set)
## Other platforms:
## $HOME/.matplotlib/matplotlibrc
## and edit that copy.
##
## See https://matplotlib.org/stable/users/explain/customizing.html#customizing-with-matplotlibrc-files
## for more details on the paths which are checked for the configuration file.
##
## Blank lines, or lines starting with a comment symbol, are ignored, as are
## trailing comments. Other lines must have the format:
## key: val # optional comment
##
## Formatting: Use PEP8-like style (as enforced in the rest of the codebase).
## All lines start with an additional '#', so that removing all leading '#'s
## yields a valid style file.
##
## Colors: for the color values below, you can either use
## - a Matplotlib color string, such as r, k, or b
## - an RGB tuple, such as (1.0, 0.5, 0.0)
## - a double-quoted hex string, such as "#ff00ff".
## The unquoted string ff00ff is also supported for backward
## compatibility, but is discouraged.
## - a scalar grayscale intensity such as 0.75
## - a legal html color name, e.g., red, blue, darkslategray
##
## String values may optionally be enclosed in double quotes, which allows
## using the comment character # in the string.
##
## This file (and other style files) must be encoded as utf-8.
##
## Matplotlib configuration are currently divided into following parts:
## - BACKENDS
## - LINES
## - PATCHES
## - HATCHES
## - BOXPLOT
## - FONT
## - TEXT
## - LaTeX
## - AXES
## - DATES
## - TICKS
## - GRIDS
## - LEGEND
## - FIGURE
## - IMAGES
## - CONTOUR PLOTS
## - ERRORBAR PLOTS
## - HISTOGRAM PLOTS
## - SCATTER PLOTS
## - AGG RENDERING
## - PATHS
## - SAVING FIGURES
## - INTERACTIVE KEYMAPS
## - ANIMATION
##### CONFIGURATION BEGINS HERE
## ***************************************************************************
## * BACKENDS *
## ***************************************************************************
## The default backend. If you omit this parameter, the first working
## backend from the following list is used:
## MacOSX QtAgg Gtk4Agg Gtk3Agg TkAgg WxAgg Agg
## Other choices include:
## QtCairo GTK4Cairo GTK3Cairo TkCairo WxCairo Cairo
## Qt5Agg Qt5Cairo Wx # deprecated.
## PS PDF SVG Template
## You can also deploy your own backend outside of Matplotlib by referring to
## the module name (which must be in the PYTHONPATH) as 'module://my_backend'.
##backend: Agg
## The port to use for the web server in the WebAgg backend.
#webagg.port: 8988
## The address on which the WebAgg web server should be reachable
#webagg.address: 127.0.0.1
## If webagg.port is unavailable, a number of other random ports will
## be tried until one that is available is found.
#webagg.port_retries: 50
## When True, open the web browser to the plot that is shown
#webagg.open_in_browser: True
## If you are running pyplot inside a GUI and your backend choice
## conflicts, we will automatically try to find a compatible one for
## you if backend_fallback is True
#backend_fallback: True
#interactive: False
#figure.hooks: # list of dotted.module.name:dotted.callable.name
#toolbar: toolbar2 # {None, toolbar2, toolmanager}
#timezone: UTC # a pytz timezone string, e.g., US/Central or Europe/Paris
## ***************************************************************************
## * LINES *
## ***************************************************************************
## See https://matplotlib.org/stable/api/artist_api.html#module-matplotlib.lines
## for more information on line properties.
#lines.linewidth: 1.5 # line width in points
#lines.linestyle: - # solid line
#lines.color: C0 # has no affect on plot(); see axes.prop_cycle
#lines.marker: None # the default marker
#lines.markerfacecolor: auto # the default marker face color
#lines.markeredgecolor: auto # the default marker edge color
#lines.markeredgewidth: 1.0 # the line width around the marker symbol
#lines.markersize: 6 # marker size, in points
#lines.dash_joinstyle: round # {miter, round, bevel}
#lines.dash_capstyle: butt # {butt, round, projecting}
#lines.solid_joinstyle: round # {miter, round, bevel}
#lines.solid_capstyle: projecting # {butt, round, projecting}
#lines.antialiased: True # render lines in antialiased (no jaggies)
## The three standard dash patterns. These are scaled by the linewidth.
#lines.dashed_pattern: 3.7, 1.6
#lines.dashdot_pattern: 6.4, 1.6, 1, 1.6
#lines.dotted_pattern: 1, 1.65
#lines.scale_dashes: True
#markers.fillstyle: full # {full, left, right, bottom, top, none}
#pcolor.shading: auto
#pcolormesh.snap: True # Whether to snap the mesh to pixel boundaries. This is
# provided solely to allow old test images to remain
# unchanged. Set to False to obtain the previous behavior.
## ***************************************************************************
## * PATCHES *
## ***************************************************************************
## Patches are graphical objects that fill 2D space, like polygons or circles.
## See https://matplotlib.org/stable/api/artist_api.html#module-matplotlib.patches
## for more information on patch properties.
#patch.linewidth: 1.0 # edge width in points.
#patch.facecolor: C0
#patch.edgecolor: black # By default, Patches and Collections do not draw edges.
# This value is only used if facecolor is "none"
# (an Artist without facecolor and edgecolor would be
# invisible) or if patch.force_edgecolor is True.
#patch.force_edgecolor: False # By default, Patches and Collections do not draw edges.
# Set this to True to draw edges with patch.edgedcolor
# as the default edgecolor.
# This is mainly relevant for styles.
#patch.antialiased: True # render patches in antialiased (no jaggies)
## ***************************************************************************
## * HATCHES *
## ***************************************************************************
#hatch.color: edge
#hatch.linewidth: 1.0
## ***************************************************************************
## * BOXPLOT *
## ***************************************************************************
#boxplot.notch: False
#boxplot.vertical: True
#boxplot.whiskers: 1.5
#boxplot.bootstrap: None
#boxplot.patchartist: False
#boxplot.showmeans: False
#boxplot.showcaps: True
#boxplot.showbox: True
#boxplot.showfliers: True
#boxplot.meanline: False
#boxplot.flierprops.color: black
#boxplot.flierprops.marker: o
#boxplot.flierprops.markerfacecolor: none
#boxplot.flierprops.markeredgecolor: black
#boxplot.flierprops.markeredgewidth: 1.0
#boxplot.flierprops.markersize: 6
#boxplot.flierprops.linestyle: none
#boxplot.flierprops.linewidth: 1.0
#boxplot.boxprops.color: black
#boxplot.boxprops.linewidth: 1.0
#boxplot.boxprops.linestyle: -
#boxplot.whiskerprops.color: black
#boxplot.whiskerprops.linewidth: 1.0
#boxplot.whiskerprops.linestyle: -
#boxplot.capprops.color: black
#boxplot.capprops.linewidth: 1.0
#boxplot.capprops.linestyle: -
#boxplot.medianprops.color: C1
#boxplot.medianprops.linewidth: 1.0
#boxplot.medianprops.linestyle: -
#boxplot.meanprops.color: C2
#boxplot.meanprops.marker: ^
#boxplot.meanprops.markerfacecolor: C2
#boxplot.meanprops.markeredgecolor: C2
#boxplot.meanprops.markersize: 6
#boxplot.meanprops.linestyle: --
#boxplot.meanprops.linewidth: 1.0
## ***************************************************************************
## * FONT *
## ***************************************************************************
## The font properties used by `text.Text`.
## See https://matplotlib.org/stable/api/font_manager_api.html for more information
## on font properties. The 6 font properties used for font matching are
## given below with their default values.
##
## The font.family property can take either a single or multiple entries of any
## combination of concrete font names (not supported when rendering text with
## usetex) or the following five generic values:
## - 'serif' (e.g., Times),
## - 'sans-serif' (e.g., Helvetica),
## - 'cursive' (e.g., Zapf-Chancery),
## - 'fantasy' (e.g., Western), and
## - 'monospace' (e.g., Courier).
## Each of these values has a corresponding default list of font names
## (font.serif, etc.); the first available font in the list is used. Note that
## for font.serif, font.sans-serif, and font.monospace, the first element of
## the list (a DejaVu font) will always be used because DejaVu is shipped with
## Matplotlib and is thus guaranteed to be available; the other entries are
## left as examples of other possible values.
##
## The font.style property has three values: normal (or roman), italic
## or oblique. The oblique style will be used for italic, if it is not
## present.
##
## The font.variant property has two values: normal or small-caps. For
## TrueType fonts, which are scalable fonts, small-caps is equivalent
## to using a font size of 'small', or about 83 % of the current font
## size.
##
## The font.weight property has effectively 13 values: normal, bold,
## bolder, lighter, 100, 200, 300, ..., 900. Normal is the same as
## 400, and bold is 700. bolder and lighter are relative values with
## respect to the current weight.
##
## The font.stretch property has 11 values: ultra-condensed,
## extra-condensed, condensed, semi-condensed, normal, semi-expanded,
## expanded, extra-expanded, ultra-expanded, wider, and narrower. This
## property is not currently implemented.
##
## The font.size property is the default font size for text, given in points.
## 10 pt is the standard value.
##
## Note that font.size controls default text sizes. To configure
## special text sizes tick labels, axes, labels, title, etc., see the rc
## settings for axes and ticks. Special text sizes can be defined
## relative to font.size, using the following values: xx-small, x-small,
## small, medium, large, x-large, xx-large
#font.family: sans-serif
#font.style: normal
#font.variant: normal
#font.weight: normal
#font.stretch: normal
#font.size: 10.0
#font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
#font.sans-serif: DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
#font.cursive: Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, Comic Neue, Comic Sans MS, cursive
#font.fantasy: Chicago, Charcoal, Impact, Western, xkcd script, fantasy
#font.monospace: DejaVu Sans Mono, Bitstream Vera Sans Mono, Computer Modern Typewriter, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace
## If font.enable_last_resort is True, then Unicode Consortium's Last Resort
## font will be appended to all font selections. This ensures that there will
## always be a glyph displayed.
#font.enable_last_resort: true
## ***************************************************************************
## * TEXT *
## ***************************************************************************
## The text properties used by `text.Text`.
## See https://matplotlib.org/stable/api/artist_api.html#module-matplotlib.text
## for more information on text properties
#text.color: black
## The language of the text in a format accepted by libraqm, namely `a BCP47 language
## code <https://www.w3.org/International/articles/language-tags/>`_. If None, then no
## particular language will be implied, and default font settings will be used.
#text.language: None
## FreeType hinting flag ("foo" corresponds to FT_LOAD_FOO); may be one of the
## following (Proprietary Matplotlib-specific synonyms are given in parentheses,
## but their use is discouraged):
## - default: Use the font's native hinter if possible, else FreeType's auto-hinter.
## ("either" is a synonym).
## - no_autohint: Use the font's native hinter if possible, else don't hint.
## ("native" is a synonym.)
## - force_autohint: Use FreeType's auto-hinter. ("auto" is a synonym.)
## - no_hinting: Disable hinting. ("none" is a synonym.)
#text.hinting: default
#text.hinting_factor: None # This setting does nothing and is deprecated.
#text.kerning_factor: None # Specifies the scaling factor for kerning values. Values
# other than 0, 6, or None have no defined meaning.
# This setting is deprecated.
#text.antialiased: True # If True (default), the text will be antialiased.
# This only affects raster outputs.
#text.parse_math: True # Use mathtext if there is an even number of unescaped
# dollar signs.
## ***************************************************************************
## * LaTeX *
## ***************************************************************************
## For more information on LaTeX properties, see
## https://matplotlib.org/stable/users/explain/text/usetex.html
#text.usetex: False # use latex for all text handling. The following fonts
# are supported through the usual rc parameter settings:
# new century schoolbook, bookman, times, palatino,
# zapf chancery, charter, serif, sans-serif, helvetica,
# avant garde, courier, monospace, computer modern roman,
# computer modern sans serif, computer modern typewriter
## The TeX engine/format to use. The following values are supported:
## - "latex": The classic TeX engine (the current default). All backends render
## TeX's output by parsing the DVI output into glyphs and boxes and emitting
## those one by one.
## - "latex+dvipng": The same as "latex", with the exception that Agg-based
## backends rely on dvipng to rasterize TeX's output. This value was the
## default up to Matplotlib 3.10.
#text.latex.engine: latex
#text.latex.preamble: # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES
# AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP
# IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO.
# text.latex.preamble is a single line of LaTeX code that
# will be passed on to the LaTeX system. It may contain
# any code that is valid for the LaTeX "preamble", i.e.
# between the "\documentclass" and "\begin{document}"
# statements.
# Note that it has to be put on a single line, which may
# become quite long.
# The following packages are always loaded with usetex,
# so beware of package collisions:
# color, fix-cm, geometry, graphicx, textcomp.
# PostScript (PSNFSS) font packages may also be
# loaded, depending on your font settings.
## The following settings allow you to select the fonts in math mode.
#mathtext.fontset: dejavusans # Should be 'dejavusans' (default),
# 'dejavuserif', 'cm' (Computer Modern), 'stix',
# 'stixsans' or 'custom'
## "mathtext.fontset: custom" is defined by the mathtext.bf, .cal, .it, ...
## settings which map a TeX font name to a fontconfig font pattern. (These
## settings are not used for other font sets.)
#mathtext.bf: sans:bold
#mathtext.bfit: sans:italic:bold
#mathtext.cal: cursive
#mathtext.it: sans:italic
#mathtext.rm: sans
#mathtext.sf: sans
#mathtext.tt: monospace
#mathtext.fallback: cm # Select fallback font from ['cm' (Computer Modern), 'stix'
# 'stixsans'] when a symbol cannot be found in one of the
# custom math fonts. Select 'None' to not perform fallback
# and replace the missing character by a dummy symbol.
#mathtext.default: normal # The default font to use for math.
# Can be any of the LaTeX font names (normal, it, bf,
# etc.), including the special name "regular" for the
# same font used in regular text.
## ***************************************************************************
## * AXES *
## ***************************************************************************
## Following are default face and edge colors, default tick sizes,
## default font sizes for tick labels, and so on. See
## https://matplotlib.org/stable/api/axes_api.html#module-matplotlib.axes
#axes.facecolor: white # axes background color
#axes.edgecolor: black # axes edge color
#axes.linewidth: 0.8 # edge line width
#axes.grid: False # display grid or not
#axes.grid.axis: both # which axis the grid should apply to
#axes.grid.which: major # grid lines at {major, minor, both} ticks
#axes.titlelocation: center # alignment of the title: {left, right, center}
#axes.titlesize: large # font size of the axes title
#axes.titleweight: normal # font weight of title
#axes.titlecolor: auto # color of the axes title, auto falls back to
# text.color as default value
#axes.titley: None # position title (axes relative units). None implies auto
#axes.titlepad: 6.0 # pad between axes and title in points
#axes.labelsize: medium # font size of the x and y labels
#axes.labelpad: 4.0 # space between label and axis
#axes.labelweight: normal # weight of the x and y labels
#axes.labelcolor: black
#axes.axisbelow: line # draw axis gridlines and ticks:
# - below patches (True)
# - above patches but below lines ('line')
# - above all (False)
#axes.formatter.limits: -5, 6 # use scientific notation if log10
# of the axis range is smaller than the
# first or larger than the second
#axes.formatter.use_locale: False # When True, format tick labels
# according to the user's locale.
# For example, use ',' as a decimal
# separator in the fr_FR locale.
#axes.formatter.use_mathtext: False # When True, use mathtext for scientific
# notation.
#axes.formatter.min_exponent: 0 # minimum exponent to format in scientific notation
#axes.formatter.useoffset: True # If True, the tick label formatter
# will default to labeling ticks relative
# to an offset when the data range is
# small compared to the minimum absolute
# value of the data.
#axes.formatter.offset_threshold: 4 # When useoffset is True, the offset
# will be used when it can remove
# at least this number of significant
# digits from tick labels.
#axes.spines.left: True # display axis spines
#axes.spines.bottom: True
#axes.spines.top: True
#axes.spines.right: True
#axes.unicode_minus: True # use Unicode for the minus symbol rather than hyphen. See
# https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
#axes.prop_cycle: cycler(color='tab10')
# color cycle for plot lines as either a named color sequence or a list
# of string color specs: single letter, long name, or web-style hex
# As opposed to all other parameters in this file, the color
# values must be enclosed in quotes for this parameter,
# e.g. '1f77b4', instead of 1f77b4.
# See also https://matplotlib.org/stable/users/explain/artists/color_cycle.html
# for more details on prop_cycle usage.
#axes.xmargin: .05 # x margin. See `axes.Axes.margins`
#axes.ymargin: .05 # y margin. See `axes.Axes.margins`
#axes.zmargin: .05 # z margin. See `axes.Axes.margins`
#axes.autolimit_mode: data # If "data", use axes.xmargin and axes.ymargin as is.
# If "round_numbers", after application of margins, axis
# limits are further expanded to the nearest "round" number.
#polaraxes.grid: True # display grid on polar axes
#axes3d.grid: True # display grid on 3D axes
#axes3d.automargin: False # automatically add margin when manually setting 3D axis limits
#axes3d.xaxis.panecolor: (0.95, 0.95, 0.95, 0.5) # background pane on 3D axes
#axes3d.yaxis.panecolor: (0.90, 0.90, 0.90, 0.5) # background pane on 3D axes
#axes3d.zaxis.panecolor: (0.925, 0.925, 0.925, 0.5) # background pane on 3D axes
#axes3d.depthshade: True # depth shade for 3D scatter plots
#axes3d.depthshade_minalpha: 0.3 # minimum alpha value for depth shading
#axes3d.mouserotationstyle: arcball # {azel, trackball, sphere, arcball}
# See also https://matplotlib.org/stable/api/toolkits/mplot3d/view_angles.html#rotation-with-mouse
#axes3d.trackballsize: 0.667 # trackball diameter, in units of the Axes bbox
#axes3d.trackballborder: 0.2 # trackball border width, in units of the Axes bbox (only for 'sphere' and 'arcball' style)
#axes3d.snap_rotation: 5.0 # Snap angle (degrees) for 3D rotation when holding Control.
## ***************************************************************************
## * AXIS *
## ***************************************************************************
#xaxis.labellocation: center # alignment of the xaxis label: {left, right, center}
#yaxis.labellocation: center # alignment of the yaxis label: {bottom, top, center}
## ***************************************************************************
## * DATES *
## ***************************************************************************
## These control the default format strings used in AutoDateFormatter.
## Any valid format datetime format string can be used (see the python
## `datetime` for details). For example, by using:
## - '%x' will use the locale date representation
## - '%X' will use the locale time representation
## - '%c' will use the full locale datetime representation
## These values map to the scales:
## {'year': 365, 'month': 30, 'day': 1, 'hour': 1/24, 'minute': 1 / (24 * 60)}
#date.autoformatter.year: %Y
#date.autoformatter.month: %Y-%m
#date.autoformatter.day: %Y-%m-%d
#date.autoformatter.hour: %m-%d %H
#date.autoformatter.minute: %d %H:%M
#date.autoformatter.second: %H:%M:%S
#date.autoformatter.microsecond: %M:%S.%f
## The reference date for Matplotlib's internal date representation
## See https://matplotlib.org/stable/gallery/ticks/date_precision_and_epochs.html
#date.epoch: 1970-01-01T00:00:00
## 'auto', 'concise':
#date.converter: auto
## For auto converter whether to use interval_multiples:
#date.interval_multiples: True
## ***************************************************************************
## * TICKS *
## ***************************************************************************
## See https://matplotlib.org/stable/api/axis_api.html#matplotlib.axis.Tick
#xtick.top: False # draw ticks on the top side
#xtick.bottom: True # draw ticks on the bottom side
#xtick.labeltop: False # draw label on the top
#xtick.labelbottom: True # draw label on the bottom
#xtick.major.size: 3.5 # major tick size in points
#xtick.minor.size: 2 # minor tick size in points
#xtick.major.width: 0.8 # major tick width in points
#xtick.minor.width: 0.6 # minor tick width in points
#xtick.major.pad: 3.5 # distance to major tick label in points
#xtick.minor.pad: 3.4 # distance to the minor tick label in points
#xtick.color: black # color of the ticks
#xtick.labelcolor: inherit # color of the tick labels or inherit from xtick.color
#xtick.labelsize: medium # font size of the tick labels
#xtick.direction: out # direction: {in, out, inout}
#xtick.minor.visible: False # visibility of minor ticks on x-axis
#xtick.major.top: True # draw x axis top major ticks
#xtick.major.bottom: True # draw x axis bottom major ticks
#xtick.minor.top: True # draw x axis top minor ticks
#xtick.minor.bottom: True # draw x axis bottom minor ticks
#xtick.minor.ndivs: auto # number of minor ticks between the major ticks on x-axis
#xtick.alignment: center # alignment of xticks
#ytick.left: True # draw ticks on the left side
#ytick.right: False # draw ticks on the right side
#ytick.labelleft: True # draw tick labels on the left side
#ytick.labelright: False # draw tick labels on the right side
#ytick.major.size: 3.5 # major tick size in points
#ytick.minor.size: 2 # minor tick size in points
#ytick.major.width: 0.8 # major tick width in points
#ytick.minor.width: 0.6 # minor tick width in points
#ytick.major.pad: 3.5 # distance to major tick label in points
#ytick.minor.pad: 3.4 # distance to the minor tick label in points
#ytick.color: black # color of the ticks
#ytick.labelcolor: inherit # color of the tick labels or inherit from ytick.color
#ytick.labelsize: medium # font size of the tick labels
#ytick.direction: out # direction: {in, out, inout}
#ytick.minor.visible: False # visibility of minor ticks on y-axis
#ytick.major.left: True # draw y axis left major ticks
#ytick.major.right: True # draw y axis right major ticks
#ytick.minor.left: True # draw y axis left minor ticks
#ytick.minor.right: True # draw y axis right minor ticks
#ytick.minor.ndivs: auto # number of minor ticks between the major ticks on y-axis
#ytick.alignment: center_baseline # alignment of yticks
## ***************************************************************************
## * GRIDS *
## ***************************************************************************
#grid.color: "#b0b0b0" # grid color
#grid.linestyle: - # solid
#grid.linewidth: 0.8 # in points
#grid.alpha: 1.0 # transparency, between 0.0 and 1.0
#grid.major.color: None # If None defaults to grid.color
#grid.major.linestyle: None # If None defaults to grid.linestyle
#grid.major.linewidth: None # If None defaults to grid.linewidth
#grid.major.alpha: None # If None defaults to grid.alpha
#grid.minor.color: None # If None defaults to grid.color
#grid.minor.linestyle: None # If None defaults to grid.linestyle
#grid.minor.linewidth: None # If None defaults to grid.linewidth
#grid.minor.alpha: None # If None defaults to grid.alpha
## ***************************************************************************
## * LEGEND *
## ***************************************************************************
#legend.loc: best
#legend.frameon: True # if True, draw the legend on a background patch
#legend.framealpha: 0.8 # legend patch transparency
#legend.facecolor: inherit # inherit from axes.facecolor; or color spec
#legend.edgecolor: 0.8 # background patch boundary color
#legend.linewidth: None # line width of the legend frame, None means inherit from patch.linewidth
#legend.fancybox: True # if True, use a rounded box for the
# legend background, else a rectangle
#legend.shadow: False # if True, give background a shadow effect
#legend.numpoints: 1 # the number of marker points in the legend line
#legend.scatterpoints: 1 # number of scatter points
#legend.markerscale: 1.0 # the relative size of legend markers vs. original
#legend.fontsize: medium
#legend.labelcolor: None
#legend.title_fontsize: None # None sets to the same as the default axes.
## Dimensions as fraction of font size:
#legend.borderpad: 0.4 # border whitespace
#legend.labelspacing: 0.5 # the vertical space between the legend entries
#legend.handlelength: 2.0 # the length of the legend lines
#legend.handleheight: 0.7 # the height of the legend handle
#legend.handletextpad: 0.8 # the space between the legend line and legend text
#legend.borderaxespad: 0.5 # the border between the axes and legend edge
#legend.columnspacing: 2.0 # column separation
## ***************************************************************************
## * FIGURE *
## ***************************************************************************
## See https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure
#figure.titlesize: large # size of the figure title (``Figure.suptitle()``)
#figure.titleweight: normal # weight of the figure title
#figure.labelsize: large # size of the figure label (``Figure.sup[x|y]label()``)
#figure.labelweight: normal # weight of the figure label
#figure.figsize: 6.4, 4.8 # figure size in inches
#figure.dpi: 100 # figure dots per inch
#figure.facecolor: white # figure face color
#figure.edgecolor: white # figure edge color
#figure.frameon: True # enable figure frame
#figure.max_open_warning: 20 # The maximum number of figures to open through
# the pyplot interface before emitting a warning.
# If less than one this feature is disabled.
#figure.raise_window : True # Raise the GUI window to front when show() is called.
# If set to False, we currently do not take any further
# actions and whether the window appears on the front
# may depend on the GUI framework and window manager.
## The figure subplot parameters. All dimensions are a fraction of the figure width and height.
#figure.subplot.left: 0.125 # the left side of the subplots of the figure
#figure.subplot.right: 0.9 # the right side of the subplots of the figure
#figure.subplot.bottom: 0.11 # the bottom of the subplots of the figure
#figure.subplot.top: 0.88 # the top of the subplots of the figure
#figure.subplot.wspace: 0.2 # the amount of width reserved for space between subplots,
# expressed as a fraction of the average axis width
#figure.subplot.hspace: 0.2 # the amount of height reserved for space between subplots,
# expressed as a fraction of the average axis height
## Figure layout
#figure.autolayout: False # When True, automatically adjust subplot
# parameters to make the plot fit the figure
# using `tight_layout`
#figure.constrained_layout.use: False # When True, automatically make plot
# elements fit on the figure. (Not
# compatible with `autolayout`, above).
## Padding (in inches) around axes; defaults to 3/72 inches, i.e. 3 points.
#figure.constrained_layout.h_pad: 0.04167
#figure.constrained_layout.w_pad: 0.04167
## Spacing between subplots, relative to the subplot sizes. Much smaller than for
## tight_layout (figure.subplot.hspace, figure.subplot.wspace) as constrained_layout
## already takes surrounding texts (titles, labels, # ticklabels) into account.
#figure.constrained_layout.hspace: 0.02
#figure.constrained_layout.wspace: 0.02
## ***************************************************************************
## * IMAGES *
## ***************************************************************************
#image.aspect: equal # {equal, auto} or a number
#image.interpolation: auto # see help(imshow) for options
#image.interpolation_stage: auto # see help(imshow) for options
#image.cmap: viridis # A colormap name (plasma, magma, etc.)
#image.lut: 256 # the size of the colormap lookup table
#image.origin: upper # {lower, upper}
#image.resample: True
#image.composite_image: True # When True, all the images on a set of axes are
# combined into a single composite image before
# saving a figure as a vector graphics file,
# such as a PDF.
## ***************************************************************************
## * CONTOUR PLOTS *
## ***************************************************************************
#contour.negative_linestyle: dashed # string or on-off ink sequence
#contour.corner_mask: True # {True, False}
#contour.linewidth: None # {float, None} Size of the contour line
# widths. If set to None, it falls back to
# `line.linewidth`.
#contour.algorithm: mpl2014 # {mpl2005, mpl2014, serial, threaded}
## ***************************************************************************
## * ERRORBAR PLOTS *
## ***************************************************************************
#errorbar.capsize: 0 # length of end cap on error bars in pixels
#errorbar.capthick: None # thickness of end cap on error bars in points
#errorbar.elinewidth: None # line width of error bar lines in points
## ***************************************************************************
## * HISTOGRAM PLOTS *
## ***************************************************************************
#hist.bins: 10 # The default number of histogram bins or 'auto'.
## ***************************************************************************
## * SCATTER PLOTS *
## ***************************************************************************
#scatter.marker: o # The default marker type for scatter plots.
#scatter.edgecolors: face # The default edge colors for scatter plots.
## ***************************************************************************
## * AGG RENDERING *
## ***************************************************************************
## Warning: experimental, 2008/10/10
#agg.path.chunksize: 0 # 0 to disable; values in the range
# 10000 to 100000 can improve speed slightly
# and prevent an Agg rendering failure
# when plotting very large data sets,
# especially if they are very gappy.
# It may cause minor artifacts, though.
# A value of 20000 is probably a good
# starting point.
## ***************************************************************************
## * PATHS *
## ***************************************************************************
#path.simplify: True # When True, simplify paths by removing "invisible"
# points to reduce file size and increase rendering
# speed
#path.simplify_threshold: 0.111111111111 # The threshold of similarity below
# which vertices will be removed in
# the simplification process.
#path.snap: True # When True, rectilinear axis-aligned paths will be snapped
# to the nearest pixel when certain criteria are met.
# When False, paths will never be snapped.
#path.sketch: None # May be None, or a tuple of the form:
# path.sketch: (scale, length, randomness)
# - *scale* is the amplitude of the wiggle
# perpendicular to the line (in pixels).
# - *length* is the length of the wiggle along the
# line (in pixels).
# - *randomness* is the factor by which the length is
# randomly scaled.
#path.effects:
## ***************************************************************************
## * SAVING FIGURES *
## ***************************************************************************
## The default savefig parameters can be different from the display parameters
## e.g., you may want a higher resolution, or to make the figure
## background white
#savefig.dpi: figure # figure dots per inch or 'figure'
#savefig.facecolor: auto # figure face color when saving
#savefig.edgecolor: auto # figure edge color when saving
#savefig.format: png # {png, ps, pdf, svg}
#savefig.bbox: standard # {tight, standard}
# 'tight' is incompatible with generating frames
# for animation
#savefig.pad_inches: 0.1 # padding to be used, when bbox is set to 'tight'
#savefig.directory: ~ # default directory in savefig dialog, gets updated after
# interactive saves, unless set to the empty string (i.e.
# the current directory); use '.' to start at the current
# directory but update after interactive saves
#savefig.transparent: False # whether figures are saved with a transparent
# background by default
#savefig.orientation: portrait # orientation of saved figure, for PostScript output only
### macosx backend params
#macosx.window_mode : system # How to open new figures (system, tab, window)
# system uses the MacOS system preferences
### tk backend params
#tk.window_focus: False # Maintain shell focus for TkAgg
### ps backend params
#ps.papersize: letter # {figure, letter, legal, ledger, A0-A10, B0-B10}
#ps.useafm: False # use AFM fonts, results in small files
#ps.usedistiller: False # {ghostscript, xpdf, None}
# Experimental: may produce smaller files.
# xpdf intended for production of publication quality files,
# but requires ghostscript, xpdf and ps2eps
#ps.distiller.res: 6000 # dpi
#ps.fonttype: 3 # Output Type 3 (Type3) or Type 42 (TrueType)
### PDF backend params
#pdf.compression: 6 # integer from 0 to 9
# 0 disables compression (good for debugging)
#pdf.fonttype: 3 # Output Type 3 (Type3) or Type 42 (TrueType)
#pdf.use14corefonts: False
#pdf.inheritcolor: False
### SVG backend params
#svg.image_inline: True # Write raster image data directly into the SVG file
#svg.fonttype: path # How to handle SVG fonts:
# path: Embed characters as paths -- supported
# by most SVG renderers
# none: Assume fonts are installed on the
# machine where the SVG will be viewed.
#svg.hashsalt: None # If not None, use this string as hash salt instead of uuid4
#svg.id: None # If not None, use this string as the value for the `id`
# attribute in the top <svg> tag
### pgf parameter
## See https://matplotlib.org/stable/tutorials/text/pgf.html for more information.
#pgf.rcfonts: True
#pgf.preamble: # See text.latex.preamble for documentation
#pgf.texsystem: xelatex
### docstring params
#docstring.hardcopy: False # set this when you want to generate hardcopy docstring
## ***************************************************************************
## * INTERACTIVE KEYMAPS *
## ***************************************************************************
## Event keys to interact with figures/plots via keyboard.
## See https://matplotlib.org/stable/users/explain/interactive.html for more
## details on interactive navigation. Customize these settings according to
## your needs. Leave the field(s) empty if you don't need a key-map. (i.e.,
## fullscreen : '')
#keymap.fullscreen: f, ctrl+f # toggling
#keymap.home: h, r, home # home or reset mnemonic
#keymap.back: left, c, backspace, MouseButton.BACK # forward / backward keys
#keymap.forward: right, v, MouseButton.FORWARD # for quick navigation
#keymap.pan: p # pan mnemonic
#keymap.zoom: o # zoom mnemonic
#keymap.save: s, ctrl+s # saving current figure
#keymap.help: f1 # display help about active tools
#keymap.quit: ctrl+w, cmd+w, q # close the current figure
#keymap.quit_all: # close all figures
#keymap.grid: g # switching on/off major grids in current axes
#keymap.grid_minor: G # switching on/off minor grids in current axes
#keymap.yscale: l # toggle scaling of y-axes ('log'/'linear')
#keymap.xscale: k, L # toggle scaling of x-axes ('log'/'linear')
#keymap.copy: ctrl+c, cmd+c # copy figure to clipboard
## ***************************************************************************
## * ANIMATION *
## ***************************************************************************
#animation.html: none # How to display the animation as HTML in
# the IPython notebook:
# - 'html5' uses HTML5 video tag
# - 'jshtml' creates a JavaScript animation
#animation.writer: ffmpeg # MovieWriter 'backend' to use
#animation.codec: h264 # Codec to use for writing movie
#animation.bitrate: -1 # Controls size/quality trade-off for movie.
# -1 implies let utility auto-determine
#animation.frame_format: png # Controls frame format used by temp files
## Path to ffmpeg binary. Unqualified paths are resolved by subprocess.Popen.
#animation.ffmpeg_path: ffmpeg
## Additional arguments to pass to ffmpeg.
#animation.ffmpeg_args:
## Path to ImageMagick's convert binary. Unqualified paths are resolved by
## subprocess.Popen, except that on Windows, we look up an install of
## ImageMagick in the registry (as convert is also the name of a system tool).
#animation.convert_path: convert
## Additional arguments to pass to convert.
#animation.convert_args: -layers, OptimizePlus
#
#animation.embed_limit: 20.0 # Limit, in MB, of size of base64 encoded
# animation in HTML (i.e. IPython notebook)
+129 -89
View File
@@ -4,11 +4,71 @@
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import math import math
import matplotlib.pyplot as plt import warnings
import codecs
### ----------------------------------------------------------------------------------------------------------------------------------- ### ### ----------------------------------------------------------------------------------------------------------------------------------- ###
### OFR ANALYSIS ### OFR ANALYSIS
class Distribution():
def __init__(self, variable_array, function_array, form = 'log10'):
self.var = variable_array
self.fct = function_array
self.__form = form
def transform(self, to = 'linear'):
if self.__form == to:
warnings.warn("Already in desired format. Transformation has no effect.")
return
# TODO: check the transformations!
match to:
case 'linear':
if self.__form == 'ln':
self.var = np.exp(self.var)
self.fct = np.divide(self.fct, self.var)
elif self.__form == 'log10':
self.var = np.power(10, self.var)
self.fct = np.divide(self.fct, self.var * np.log(10))
case 'ln':
if self.__form == 'linear':
self.var = np.log(self.var)
self.fct = np.multiply(self.var, self.fct)
elif self.__form == 'log10':
self.var = np.log(np.power(10, self.var))
self.fct = np.divide(self.fct, np.log(10))
case 'log10':
if self.__form == 'linear':
self.var = np.log10(self.var)
self.fct = np.multiply(self.var, self.fct * np.log(10))
elif self.__form == 'ln':
self.var = np.log10(np.exp(self.var))
self.fct = np.multiply(self.fct, np.log(10))
def integrate(self) -> np.float64:
return np.trapezoid(y = self.fct, x = self.var)
def median():
# TODO: implement that method
pass
def mode():
# TODO: implement that method
pass
def mean():
# TODO: implement that method
pass
def variance():
# TODO: implement that method
pass
class OFRSample: class OFRSample:
"""Object to represent a single sample from the OFR """Object to represent a single sample from the OFR
@@ -40,48 +100,7 @@ class OFRSample:
The density (kg/m3) of the SOA produced in the OFR The density (kg/m3) of the SOA produced in the OFR
""" """
def __init__(self, source_file, sample_number, data_separator): def __get_data(self) -> np.float64:
# Sample information
self.source_file = source_file # where the data is stored, i.e. "C:/Users/tschan_d/..."
self.sample_number = sample_number # sample number, i.e. 33
self.__data_separator = data_separator
self.scan_up_time = None # Time to scan up the voltage range in DMA, in (s)
self.scan_down_time = None # Time to scan down the voltage range in DMA, in(s)
self.sample_time = None
self.lower_diameter_bound = None # Lower Diameter bound of CPC, in (nm)
self.upper_diameter_bound = None # Upper Diameter bound of CPC, in (nm)
self.aerosol_flow = None # Aerosol flow, in (m3/s)
self.SOA_density = None # Expected density of SOA, in (kg/m3)
# Sample Distributions
self.diameters = None # Bin Midpoint Diameter, in (m)
self.count_density = None # Count Density dN/dlnD, in (#/m3)
self.surface_density = None # Surface Density dS/dlnD, in (m2/(m3*m))
self.volume_density = None # Volume Density dV/dlnD, in (m3/(m3*m))
self.mass_density = None # Mass Density dm/dlnD, in (kg/(m3*m))
# Distributed integrated along dlnD
self.sample_count_density = None # Total Count Density (#/(m3))
self.sample_surface_density = None # Total Surface Density (m2/(m3))
self.sample_volume_density = None # Total Volume Density (m3/(m3))
self.sample_mass_density = None # Total Mass Density (kg/(m3))
# Distributions integrated over sample
self.sample_count = None # Total Count (#/(m3))
self.sample_surface = None # Total Surface (m2/(m3))
self.sample_volume = None # Total Volume (m3/(m3))
self.sample_mass = None # Total Mass (kg/(m3))
self.__get_data()
self.__get_distributions()
self.__integrate_over_distributions()
self.__integrate_over_sample()
def __get_data(self):
footer_flag = False footer_flag = False
footer_start_index = 0 footer_start_index = 0
@@ -91,7 +110,7 @@ class OFRSample:
midpoints = [] midpoints = []
counts = [] counts = []
with open(self.source_file, 'r') as file: with open(self.source_file, 'r', errors = 'ignore') as file:
for i, line in enumerate(file.readlines()): for i, line in enumerate(file.readlines()):
if i == 20: if i == 20:
data_flag = True data_flag = True
@@ -111,7 +130,7 @@ class OFRSample:
self.scan_down_time = float(line.split(self.__data_separator)[1]) self.scan_down_time = float(line.split(self.__data_separator)[1])
continue continue
elif i == footer_start_index + 6: elif i == footer_start_index + 6:
self.aerosol_flow = float(line.split(self.__data_separator)[1]) / 60000 self.aerosol_flow = float(line.split(self.__data_separator)[1])
continue continue
elif i == footer_start_index + 11: elif i == footer_start_index + 11:
self.lower_diameter_bound = float(line.split(self.__data_separator)[1]) self.lower_diameter_bound = float(line.split(self.__data_separator)[1])
@@ -120,7 +139,7 @@ class OFRSample:
self.upper_diameter_bound = float(line.split(self.__data_separator)[1]) self.upper_diameter_bound = float(line.split(self.__data_separator)[1])
continue continue
elif i == footer_start_index + 13: elif i == footer_start_index + 13:
self.SOA_density = float(line.split(self.__data_separator)[1]) * 1E3 self.SOA_density = float(line.split(self.__data_separator)[1])
continue continue
self.sample_time = self.scan_up_time + self.scan_down_time self.sample_time = self.scan_up_time + self.scan_down_time
@@ -136,45 +155,54 @@ class OFRSample:
else: else:
continue continue
# Input data from file is in (nm). Therefore, multiply with 1E-9 to get (m) # Input data from file is in (nm)
self.diameters = np.array(midpoints).reshape([-1, 1]) * 1E-9 return [np.array(midpoints), np.array(counts)]
# Input data from file is in (#/cm3). Therefore, multiply with 1E6 to get (#/m3) def __init__(self, source_file, sample_number, data_separator = ','):
self.count_density = np.array(counts).reshape([-1, 1]) * 1E6
def __get_distributions(self): ## VALUES READ IN FROM DISK
#--------------------------
self.surface_density = (math.pi * self.diameters ** 2) * self.count_density # Sample information
self.volume_density = (math.pi * self.diameters ** 3) * self.count_density self.source_file = source_file # where the data is stored, i.e. "C:/Users/tschan_d/..."
self.mass_density = self.SOA_density * self.volume_density self.sample_number = sample_number # sample number, i.e. 33
self.__data_separator = data_separator
def __integrate_over_distributions(self): self.scan_up_time = None # Time to scan up the voltage range in DMA, in (s)
self.scan_down_time = None # Time to scan down the voltage range in DMA, in(s)
self.sample_time = None # Total time to scan voltage up and back down in DMA, in (s)
self.sample_count_density = self.__integrator(integrand=np.divide(self.count_density, self.diameters)) self.lower_diameter_bound = None # Lower Diameter bound of CPC, in (nm)
self.sample_surface_density = self.__integrator(integrand=np.divide(self.surface_density, self.diameters)) self.upper_diameter_bound = None # Upper Diameter bound of CPC, in (nm)
self.sample_volume_density = self.__integrator(integrand=np.divide(self.volume_density, self.diameters)) self.aerosol_flow = None # Aerosol flow, in (L/min)
self.sample_mass_density = self.__integrator(integrand=np.divide(self.mass_density, self.diameters)) self.SOA_density = None # Expected density of SOA, in (g/cm3)
def __integrator(self, integrand: np.float64) -> np.float64:
return np.trapezoid(y = integrand.flatten(), x = self.diameters.flatten())
def __integrate_over_sample(self):
self.sample_count = self.sample_count_density * self.sample_time * self.aerosol_flow
self.sample_surface = self.sample_surface_density * self.sample_time * self.aerosol_flow
self.sample_volume = self.sample_volume_density * self.sample_time * self.aerosol_flow
self.sample_mass = self.sample_mass_density * self.sample_time * self.aerosol_flow
# Distributions of the relevant quantities (all relative to nanometer)
data = self.__get_data()
self.Count = Distribution(variable_array = np.log10(data[0]),
function_array = data[1],
form='log10')
self.Length = Distribution(variable_array = np.log10(data[0]),
function_array = data[0] * data[1],
form = 'log10')
self.Surface = Distribution(variable_array = np.log(data[0]),
function_array = ((math.pi) * data[0] ** 2) * data[1],
form = 'log10')
self.Volume = Distribution(variable_array = np.log10(data[0]),
function_array = ((math.pi / 6) * data[0] ** 3) * data[1],
form = 'log10')
self.Mass = Distribution(variable_array = np.log10(data[0]),
function_array = (self.SOA_density * (math.pi / 6) * data[0] ** 3) * data[1],
form='log10')
class OFRAnalyser: class OFRAnalyser:
def __init__(self, source_file, data_separator = ',') -> None: def __init__(self, source_file, sample_number_list, data_separator = ',') -> None:
self.source_file = source_file self.source_file = source_file
self.__data_separator = data_separator self.__data_separator = data_separator
with open(self.source_file, 'r') as file: with open(self.source_file, 'r', errors = 'ignore') as file:
for i, line in enumerate(file.readlines()): for i, line in enumerate(file.readlines()):
if i == 17: if i == 17:
items = line.split(',') items = line.split(',')
@@ -183,10 +211,10 @@ class OFRAnalyser:
continue continue
self.max_samples = max_sample_number self.max_samples = max_sample_number
self.total_counts = None self.sample_number_list = sample_number_list
self.total_surface = None
self.total_volume = None self.data = None
self.total_mass = None
def __sample_number_list_check(self, sample_number_list) -> None: def __sample_number_list_check(self, sample_number_list) -> None:
@@ -195,27 +223,39 @@ class OFRAnalyser:
if last_sample > self.max_samples: if last_sample > self.max_samples:
raise IndexError("The last sample(s) are out of range of the number of recorded samples") raise IndexError("The last sample(s) are out of range of the number of recorded samples")
def AggregateSamples(self, samples = [1]) -> None: def Analyse(self) -> None:
self.__sample_number_list_check(samples) self.__sample_number_list_check(self.sample_number_list)
counts = [] numbers = []
lengths = []
surfaces = [] surfaces = []
volumes = [] volumes = []
densities = []
masses = [] masses = []
times = []
for samplenumber in samples: for sample_number in self.sample_number_list:
sample = OFRSample(source_file=self.source_file, sample_number = samplenumber, data_separator = self.__data_separator) sample = OFRSample(source_file=self.source_file, sample_number = sample_number, data_separator = self.__data_separator)
numbers.append(sample.Count.integrate())
lengths.append(sample.Length.integrate() / 1E6)
surfaces.append(sample.Surface.integrate() / 1E12)
volumes.append(sample.Volume.integrate() / 1E9)
densities.append(sample.SOA_density)
masses.append(sample.Mass.integrate() / 1E12)
times.append(sample_number * sample.sample_time)
self.data = pd.DataFrame({'Sample': self.sample_number_list,
'Number (#/cm^3)': numbers,
'Length (mm/cm^3)': lengths,
'Surface (mm^2/cm^3)': surfaces,
'Volume (μm^3/cm^3)': volumes,
'Density (pg/μm^3)': densities,
'Mass (mg/cm^3)': masses,
'Time (s)': times})
counts.append(sample.sample_count)
surfaces.append(sample.sample_surface)
volumes.append(sample.sample_volume)
masses.append(sample.sample_mass)
self.total_counts = sum(counts)
self.total_surface = sum(surfaces)
self.total_volume = sum(volumes)
self.total_mass = sum(masses)
### ----------------------------------------------------------------------------------------------------------------------------------- ### ### ----------------------------------------------------------------------------------------------------------------------------------- ###
### ###
+61
View File
@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Bokeh Plot</title>
<style>
html, body {
box-sizing: border-box;
display: flow-root;
height: 100%;
margin: 0;
padding: 0;
}
</style>
<script src="https://cdn.bokeh.org/bokeh/release/bokeh-3.9.1.min.js"></script>
<script>
Bokeh.set_log_level("info");
</script>
</head>
<body>
<div id="e7bd5470-6f04-4029-b801-8619d61aefb3" data-root-id="p1006" style="display: contents;"></div>
<script type="application/json" id="a1c145b3-ddfb-4db6-9d1b-b5fbd76fdbe2">
{"fb880ecc-4a99-417b-afe5-feb235ee23f7":{"version":"3.9.1","title":"Bokeh Application","config":{"type":"object","name":"DocumentConfig","id":"p1051","attributes":{"notifications":{"type":"object","name":"Notifications","id":"p1052"}}},"roots":[{"type":"object","name":"Figure","id":"p1006","attributes":{"height":400,"x_range":{"type":"object","name":"DataRange1d","id":"p1007"},"y_range":{"type":"object","name":"DataRange1d","id":"p1008"},"x_scale":{"type":"object","name":"LogScale","id":"p1015"},"y_scale":{"type":"object","name":"LinearScale","id":"p1016"},"title":{"type":"object","name":"Title","id":"p1013"},"renderers":[{"type":"object","name":"GlyphRenderer","id":"p1046","attributes":{"data_source":{"type":"object","name":"ColumnDataSource","id":"p1040","attributes":{"selected":{"type":"object","name":"Selection","id":"p1041","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1042"},"data":{"type":"map","entries":[["x",{"type":"ndarray","array":{"type":"bytes","data":"H4sIAAEAAAAA/wFIA7f8hMcsmrDg9T+s+gXnvRz2PwFDsFf2XfY/oMaiNuCc9j9S3j/tQ+D2P+VSgN8xIfc/LvuWatZf9z9/9ZPlSaL3P+4murdY4vc/Hz6Aei0g+D+YnqX5Q2H4P4LsZUIOoPg/TVxtt6rh+D9lGjyi8SD5Pw5N5REMXvk//7xPqAmi+T/9wuu/O9/5Pz3NoImLHvo/Jigzv65f+j/B+Y3chJ76P6IGP8nv3vo/5eH3ZLEg+z8p8wvdGmD7P6cevrWsoPs/foqngvve+z81lKq9ZiH8P2yENOVtYfw/WCNugzuf/D/YB+Sli+D8P+r0yZCLH/0/FSuiE/1e/T9TIAMTwZ79P50qq5Yl4f0/tVtmgCYh/j92iupN7l7+P9jqKUb7nv4//1mC0f3g/j+9lciqoyD/P1tHPh4JYP8/Pk/UJyGf/z9ffqBLsN//P+0JKRHeDwBAQ21N/J4vAECupk9Q6E8AQE4NGvjYbwBAny7CtjGQAEDhufe1IrAAQEK4Uo+szwBA9s7c7ivwAEC3dSzBLRABQGZg1dC0LwFASViLOPxPAUAO8XfZuG8BQF8SIJgRkAFAaDui49OvAUBuI3GcE9ABQN2iN0M38AFAMRJpjDcQAkDPQ1wJDjACQNSdgR4qUAJA7cZdpQlwAkC3v3DGFZACQKCCAczWrwJAy7SJRRXQAkCWw4qO9u8CQDU+O47YDwNA923uPQwwA0CBEtU/J1ADQCnvn/YhcANAd6POp/WPA0CXfUs1668DQIuY5yb1zwNAkjKGUAfwA0APH0C9FhAEQIaJKpoZMARAQfYyIQdQBEBPGwcBF3AEQEZk+F3+jwRAu1KRevKvBEDbLA4I6M8EQPwUl9gL8ARA9OEo+RkQBUBISgKJCjAFQKTPXukHUAVAAWTXwAZwBUAXUrTd/I8FQJX5hW4NsAVAv+JW5gDQBUC1bBR4+e8FQD3avJjsDwZAmadENPcvBkByCfDMDFAGQMT7WG/+bwZAvWulqgqQBkBxf9l1A7AGQNUoXtQA0AZAb1tyRPjvBkAtJssv/g8HQDAlGAkHMAdA7cLxbghQB0COKbwW+W8HQLtwe18EkAdArSMfjwSwB0CdGfDDCNAHQDeGTIQG8AdAxBbr6UgDAAA="},"shape":[105],"dtype":"float64","order":"little"}],["y",{"type":"ndarray","array":{"type":"bytes","data":"H4sIAAEAAAAA/yXSb0hTURgG8Nu/YUvDXCOVMaRITLNp1sx0cspISzMFA4MggyEEVpsfRDBBhBWElFGQEwot8IOImBKs6MPUZUprrjU2KohJZtOJXmROimBen+d++e0559xz3nv2SpIkOZ0JZxQkR2Q7DL2Jiy292n9wuiIKLamrotdut890hJE7puZEo/JMie8Y//b7i/jsdrsT1Z+YZz4IdfCVpd35Vjj0tshj25go2HqeDQqTMiHXvhRt+4fLbzzpF1Zl4Jd5VMSyrj06q3mPfRdOu7Bfk8EP70ZDOLdmKALliIx1x55vIDekSah/pHkXlFv3wJKr++DTB1rYp0+H3qAO+u9nwJVbh6DuTibz7SNwKJ4DHYUGmCflQ1Xtcei6WQCXu0/Q6pMwMUwXbEbkcxcL4cNB6so9hazvp40BWmUswri5hGbUU/8q5wfmaIuVRstoaSX3Vc3yvHcGWm9iHZ1drO/oT9Z7Psz6m9b5PXs1VG7Ow/l9Rn6vy5SLnNnDe6irzkYOWLOgZ4n3Zbx+GHntHu/Rpz2InO3h/da80CNXXOK9zwfSkHXFB2CDhv9P6nAKct3/ZDgynQQtl9Vc91oFk807ode6DUpX2Leh+F+B+bIY+q1t9xr6p6p8BXnsQhhZF5xH1vjYV6EdP/CeszeI8a+LPvbhHw/Wdy27kQdGP6JPO2MTYnJd+dEyLjYBARlfTUgDAAA="},"shape":[105],"dtype":"float64","order":"little"}]]}}},"view":{"type":"object","name":"CDSView","id":"p1047","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1048"}}},"glyph":{"type":"object","name":"Line","id":"p1043","attributes":{"x":{"type":"field","field":"x"},"y":{"type":"field","field":"y"},"line_color":"#1f77b4"}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1044","attributes":{"x":{"type":"field","field":"x"},"y":{"type":"field","field":"y"},"line_color":"#1f77b4","line_alpha":0.1}},"muted_glyph":{"type":"object","name":"Line","id":"p1045","attributes":{"x":{"type":"field","field":"x"},"y":{"type":"field","field":"y"},"line_color":"#1f77b4","line_alpha":0.2}}}}],"toolbar":{"type":"object","name":"Toolbar","id":"p1014","attributes":{"tools":[{"type":"object","name":"PanTool","id":"p1027"},{"type":"object","name":"WheelZoomTool","id":"p1028","attributes":{"renderers":"auto"}},{"type":"object","name":"BoxZoomTool","id":"p1029","attributes":{"overlay":{"type":"object","name":"BoxAnnotation","id":"p1030","attributes":{"syncable":false,"line_color":"black","line_alpha":1.0,"line_width":2,"line_dash":[4,4],"fill_color":"lightgrey","fill_alpha":0.5,"level":"overlay","visible":false,"left":{"type":"number","value":"nan"},"right":{"type":"number","value":"nan"},"top":{"type":"number","value":"nan"},"bottom":{"type":"number","value":"nan"},"left_units":"canvas","right_units":"canvas","top_units":"canvas","bottom_units":"canvas","handles":{"type":"object","name":"BoxInteractionHandles","id":"p1036","attributes":{"all":{"type":"object","name":"AreaVisuals","id":"p1035","attributes":{"fill_color":"white","hover_fill_color":"lightgray"}}}}}}}},{"type":"object","name":"SaveTool","id":"p1037"},{"type":"object","name":"ResetTool","id":"p1038"},{"type":"object","name":"HelpTool","id":"p1039"}]}},"left":[{"type":"object","name":"LinearAxis","id":"p1022","attributes":{"ticker":{"type":"object","name":"BasicLine truncated
</script>
<script>
(function() {
const fn = function() {
Bokeh.safely(function() {
(function(root) {
function embed_document(root) {
const docs_json = document.getElementById('a1c145b3-ddfb-4db6-9d1b-b5fbd76fdbe2').textContent;
const render_items = [{"docid":"fb880ecc-4a99-417b-afe5-feb235ee23f7","roots":{"p1006":"e7bd5470-6f04-4029-b801-8619d61aefb3"},"root_ids":["p1006"]}];
root.Bokeh.embed.embed_items(docs_json, render_items);
}
if (root.Bokeh !== undefined) {
embed_document(root);
} else {
let attempts = 0;
const timer = setInterval(function(root) {
if (root.Bokeh !== undefined) {
clearInterval(timer);
embed_document(root);
} else {
attempts++;
if (attempts > 100) {
clearInterval(timer);
console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
}
}
}, 10, root)
}
})(window);
});
};
if (document.readyState != "loading") fn();
else document.addEventListener("DOMContentLoaded", fn);
})();
</script>
</body>
</html>
+15 -9
View File
@@ -1,16 +1,22 @@
# Imports
#%% #%%
from pathlib import Path from defs.computing import OFRSample, OFRAnalyser
from defs.computing import OFRAnalyser
import numpy as np import numpy as np
from bokeh.plotting import figure, show
from pathlib import Path
#%% # Path to the source file
analyser = OFRAnalyser(source_file=Path(r"Z:\People\David_Tschan\data\OFR_SMPS\2026\processed\06_June\20260612\20260612_SET02_EXP01_full.txt")) source_file = Path(r"C:\Users\tschan_d\Documents\data_local\20260612_SET02_EXP01_full.txt")
#samplelist = np.linspace(start=1, stop=analyser.max_samples, num=analyser.max_samples, dtype=int).tolist() # Plotting one of the spectra to show properties
# first load and get the data of sample 57 (arbitrary)
sample = OFRSample(source_file = source_file, sample_number = 150)
# Now plot the spectrum
p = figure(width = 600, height = 400, x_axis_type='log')
p.line(x = sample.Count.var, y = sample.Count.fct)
show(p)
#%%
analyser.AggregateSamples(samples=[33])
#%%
print(analyser.total_mass)
# %% # %%
+131
View File
@@ -0,0 +1,131 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "36f6dc0f",
"metadata": {},
"source": [
"### OFR Analysis"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "8769766b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" <style>\n",
" .bk-notebook-logo {\n",
" display: block;\n",
" width: 20px;\n",
" height: 20px;\n",
" background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAOkSURBVDiNjZRtaJVlGMd/1/08zzln5zjP1LWcU9N0NkN8m2CYjpgQYQXqSs0I84OLIC0hkEKoPtiH3gmKoiJDU7QpLgoLjLIQCpEsNJ1vqUOdO7ppbuec5+V+rj4ctwzd8IIbbi6u+8f1539dt3A78eXC7QizUF7gyV1fD1Yqg4JWz84yffhm0qkFqBogB9rM8tZdtwVsPUhWhGcFJngGeWrPzHm5oaMmkfEg1usvLFyc8jLRqDOMru7AyC8saQr7GG7f5fvDeH7Ej8CM66nIF+8yngt6HWaKh7k49Soy9nXurCi1o3qUbS3zWfrYeQDTB/Qj6kX6Ybhw4B+bOYoLKCC9H3Nu/leUTZ1JdRWkkn2ldcCamzrcf47KKXdAJllSlxAOkRgyHsGC/zRday5Qld9DyoM4/q/rUoy/CXh3jzOu3bHUVZeU+DEn8FInkPBFlu3+nW3Nw0mk6vCDiWg8CeJaxEwuHS3+z5RgY+YBR6V1Z1nxSOfoaPa4LASWxxdNp+VWTk7+4vzaou8v8PN+xo+KY2xsw6une2frhw05CTYOmQvsEhjhWjn0bmXPjpE1+kplmmkP3suftwTubK9Vq22qKmrBhpY4jvd5afdRA3wGjFAgcnTK2s4hY0/GPNIb0nErGMCRxWOOX64Z8RAC4oCXdklmEvcL8o0BfkNK4lUg9HTl+oPlQxdNo3Mg4Nv175e/1LDGzZen30MEjRUtmXSfiTVu1kK8W4txyV6BMKlbgk3lMwYCiusNy9fVfvvwMxv8Ynl6vxoByANLTWplvuj/nF9m2+PDtt1eiHPBr1oIfhCChQMBw6Aw0UulqTKZdfVvfG7VcfIqLG9bcldL/+pdWTLxLUy8Qq38heUIjh4XlzZxzQm19lLFlr8vdQ97rjZVOLf8nclzckbcD4wxXMidpX30sFd37Fv/GtwwhzhxGVAprjbg0gCAEeIgwCZyTV2Z1REEW8O4py0wsjeloKoMr6iCY6dP92H6Vw/oTyICIthibxjm/DfN9lVz8IqtqKYLUXfoKVMVQVVJOElGjrnnUt9T9wbgp8AyYKaGlqingHZU/uG2NTZSVqwHQTWkx9hxjkpWDaCg6Ckj5qebgBVbT3V3NNXMSiWSDdGV3hrtzla7J+duwPOToIg42ChPQOQjspnSlp1V+Gjdged7+8UN5CRAV7a5EdFNwCjEaBR27b3W890TE7g24NAP/mMDXRWrGoFPQI9ls/MWO2dWFAar/xcOIImbbpA3zgAAAABJRU5ErkJggg==);\n",
" }\n",
" </style>\n",
" <div>\n",
" <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-notebook-logo\"></a>\n",
" <span id=\"ba7b56ac-409d-4c6f-803b-da270f9806de\">Loading BokehJS ...</span>\n",
" </div>\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n Line truncated
"application/vnd.bokehjs_load.v0+json": ""
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Imports\n",
"\n",
"from defs.computing import OFRSample, OFRAnalyser\n",
"import numpy as np\n",
"from pathlib import Path\n",
"\n",
"from bokeh.plotting import figure, show\n",
"from bokeh.io import output_notebook\n",
"output_notebook()"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "3922e80c",
"metadata": {},
"outputs": [],
"source": [
"# Path to the source file\n",
"source_file = Path(r\"Z:\\People\\David_Tschan\\data\\OFR_SMPS\\2026\\processed\\06_June\\20260612\\20260612_SET02_EXP01_full.txt\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "76a9b026",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "unexpected attribute 'show' to figure, possible attributes are above, align, aspect_ratio, aspect_scale, attribution, background_fill_alpha, background_fill_color, background_hatch_alpha, background_hatch_color, background_hatch_extra, background_hatch_pattern, background_hatch_scale, background_hatch_weight, below, border_fill_alpha, border_fill_color, border_hatch_alpha, border_hatch_color, border_hatch_extra, border_hatch_pattern, border_hatch_scale, border_hatch_weight, border_line_alpha, border_line_cap, border_line_color, border_line_dash, border_line_dash_offset, border_line_join, border_line_width, center, context_menu, css_classes, css_variables, disabled, elements, extra_x_ranges, extra_x_scales, extra_y_ranges, extra_y_scales, flow_mode, frame_align, frame_height, frame_width, height, height_policy, hidpi, hold_render, html_attributes, html_id, inner_height, inner_width, js_event_callbacks, js_property_callbacks, left, lod_factor, lod_interval, lod_threshold, lod_timeout, margin, match_aspect, max_height, max_width, min_border, min_border_bottom, min_border_left, min_border_right, min_border_top, min_height, min_width, name, outer_height, outer_width, outline_line_alpha, outline_line_cap, outline_line_color, outline_line_dash, outline_line_dash_offset, outline_line_join, outline_line_width, output_backend, renderers, reset_policy, resizable, right, sizing_mode, styles, stylesheets, subscribed_events, syncable, tags, title, title_location, toolbar, toolbar_inner, toolbar_location, toolbar_sticky, visible, width, width_policy, window_axis, x_range, x_scale, y_range or y_scale",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[47]\u001b[39m\u001b[32m, line 9\u001b[39m\n\u001b[32m 5\u001b[39m \n\u001b[32m 6\u001b[39m p = figure(width=\u001b[32m600\u001b[39m, height=\u001b[32m400\u001b[39m, x_axis_type=\u001b[33m'log'\u001b[39m)\n\u001b[32m 7\u001b[39m p.line(np.power(\u001b[32m10\u001b[39m,sample.Count.var), sample.Count.fct)\n\u001b[32m 8\u001b[39m \n\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m p.show()\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\tschan_d\\AppData\\Local\\miniforge3\\envs\\MA\\Lib\\site-packages\\bokeh\\core\\has_props.py:373\u001b[39m, in \u001b[36mHasProps.__getattr__\u001b[39m\u001b[34m(self, name)\u001b[39m\n\u001b[32m 370\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(descriptor, \u001b[38;5;28mproperty\u001b[39m): \u001b[38;5;66;03m# Python property\u001b[39;00m\n\u001b[32m 371\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().\u001b[34m__getattribute__\u001b[39m(name)\n\u001b[32m--> \u001b[39m\u001b[32m373\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_raise_attribute_error_with_matches\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mname\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mproperties\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\tschan_d\\AppData\\Local\\miniforge3\\envs\\MA\\Lib\\site-packages\\bokeh\\core\\has_props.py:386\u001b[39m, in \u001b[36mHasProps._raise_attribute_error_with_matches\u001b[39m\u001b[34m(self, name, properties)\u001b[39m\n\u001b[32m 382\u001b[39m matches, text = \u001b[38;5;28msorted\u001b[39m(properties), \u001b[33m\"\u001b[39m\u001b[33mpossible\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 384\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mutil\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mstrings\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m nice_join\n\u001b[32m--> \u001b[39m\u001b[32m386\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33munexpected attribute \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33m to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m.\u001b[34m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtext\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m attributes are \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnice_join(matches)\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n",
"\u001b[31mAttributeError\u001b[39m: unexpected attribute 'show' to figure, possible attributes are above, align, aspect_ratio, aspect_scale, attribution, background_fill_alpha, background_fill_color, background_hatch_alpha, background_hatch_color, background_hatch_extra, background_hatch_pattern, background_hatch_scale, background_hatch_weight, below, border_fill_alpha, border_fill_color, border_hatch_alpha, border_hatch_color, border_hatch_extra, border_hatch_pattern, border_hatch_scale, border_hatch_weight, border_line_alpha, border_line_cap, border_line_color, border_line_dash, border_line_dash_offset, border_line_join, border_line_width, center, context_menu, css_classes, css_variables, disabled, elements, extra_x_ranges, extra_x_scales, extra_y_ranges, extra_y_scales, flow_mode, frame_align, frame_height, frame_width, height, height_policy, hidpi, hold_render, html_attributes, html_id, inner_height, inner_width, js_event_callbacks, js_property_callbacks, left, lod_factor, lod_interval, lod_threshold, lod_timeout, margin, match_aspect, max_height, max_width, min_border, min_border_bottom, min_border_left, min_border_right, min_border_top, min_height, min_width, name, outer_height, outer_width, outline_line_alpha, outline_line_cap, outline_line_color, outline_line_dash, outline_line_dash_offset, outline_line_join, outline_line_width, output_backend, renderers, reset_policy, resizable, right, sizing_mode, styles, stylesheets, subscribed_events, syncable, tags, title, title_location, toolbar, toolbar_inner, toolbar_location, toolbar_sticky, visible, width, width_policy, window_axis, x_range, x_scale, y_range or y_scale"
]
}
],
"source": [
"# Plotting one of the spectra to show properties\n",
"\n",
"# first load and get the data of sample 57 (arbitrary)\n",
"sample = OFRSample(source_file = source_file, sample_number = 33)\n",
"\n",
"p = figure(width=600, height=400, x_axis_type='log')\n",
"p.line(sample.Count.var, sample.Count.fct)\n",
"\n",
"p.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2363080b",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "MA",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}