]> pintos-os.org Git - pspp/commitdiff
work on faceting
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 10 May 2026 18:38:34 +0000 (11:38 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 11 May 2026 14:40:28 +0000 (07:40 -0700)
rust/doc/src/spv/graphs.md
rust/doc/src/spv/legacy-detail-xml.md
rust/pspp/src/file.rs
rust/pspp/src/spv/read/graph.rs
rust/pspp/src/spv/read/legacy_bin.rs
rust/pspp/src/spv/testdata/graph5.expected.svg [new file with mode: 0644]
rust/pspp/src/spv/testdata/graph5.xml [new file with mode: 0644]

index 6544d9b99bb04b5102d1b543188fcbf964643efa..909db531d0c0968d0fd471a372cd3ee72ec659cd 100644 (file)
@@ -913,3 +913,22 @@ used.  Whether a given variable has a specified format is not
 considered.  The details are muddled; for example, it appears that if
 one of the variables lacks a specified format entirely, then none of
 their formats is used.
+
+
+Nice column and row facets found by searching for 2-facetLevel xmls:
+/home/blp/pspp/spv/spv/04488e072882e8f8b0c3c687e272d4af/00000000293_-4000816061397075370_chart.xml
+
+Different contents for different cells:
+/home/blp/pspp/spv/spv/271f44f7ba0037acfe63ef8e3e7c8918/0000000003312_-6910783111487815678_chart.xml
+
+Two dotted (not crossed) facet levels (this is the only example):
+/home/blp/pspp/spv/spv/cfe40eafe2c4122adbb5412f3d463bcd/00000000302_7579179872145113090_chart.xml
+
+Rotated matrix chart with multiple facetLevels:
+/home/blp/pspp/spv/spv/301cd2376ccc9f5db2fe0df3aa91eac0/00000000013__chart.xml
+
+Rotated weird text chart with multiple facetLevels:
+/home/blp/pspp/spv/spv/66c4eb85507e7b950ff06a0aad36a466/00000002282__chart.xml
+
+Normal-ish barchart with multiple facetLevels:
+/home/blp/pspp/spv/spv/9538e0d28ff95b21336ea19a551affca/00000000072_2564001948504162306_chart.xml
index e3945ceb886d59326839d615f3174991916624c0..2d625944901f070cb35e7017f7be0b2d9a2191da 100644 (file)
@@ -682,7 +682,7 @@ course, but it is usefully indicative.
 
 Each `facetLevel` contains an `axis`, which in turn may contain a
 [`label`](#the-label-element) for the `facetLevel` and does contain a
-`majorTicks` element.
+`majorTicks` element with the following attributes:
 
 * `labelAngle`  
   Normally 0.  The value -90 causes inner column or outer row labels
index adcfe2146cc145c83a91a44c688e49929fe488a9..2955b455a7c11a5252251cce78f34ec6425a3f1a 100644 (file)
@@ -131,7 +131,7 @@ impl FileType {
     where
         R: Read + Seek,
     {
-        let mut buf = vec![0; 512];
+        let mut buf = vec![0; 1024];
         let mut n = 0;
         while n < buf.capacity() {
             let count = reader.read(&mut buf[n..])?;
index 6d220de556768100c72f7271fc0491974db6e36f..c5fbba5410bcb5225a266eaa85144baaa1412657 100644 (file)
@@ -507,7 +507,7 @@ impl Visualization {
             axis_domains[axis] = AxisDomain {
                 domain,
                 formatter: formatter.unwrap_or_else(|| Formatter::default_for_locale(locale)),
-                label: axis2.and_then(|axis| axis.label.as_ref()),
+                label: dbg!(axis2.and_then(|axis| axis.label.as_ref())),
                 major_ticks: axis2.and_then(|axis| axis.major_ticks.as_ref()),
             };
         }
@@ -758,7 +758,7 @@ impl Visualization {
                 }
             }
         }
-        for (y_index, _y_facet) in y_facets.clone().enumerate() {
+        for (y_index, y_facet) in y_facets.clone().enumerate() {
             let rect = rect.subrect(0, nx_facets, y_index, ny_facets);
             // Y axis.
             let x = rect.0[Axis2::X].0;
@@ -791,19 +791,41 @@ impl Visualization {
                             .set("text-anchor", "end"),
                     );
             }
-            if let Some(label) = &axis_domains[Axis3::Y].label {
-                let x = x - 10.0 - y_axis_text_width - font_height;
-                let y = rect.0[Axis2::Y].midpoint();
-                graph_svg.append(
-                    svg::node::element::Text::new(label.text())
-                        .set("x", x)
-                        .set("y", y)
-                        .set("dominant-baseline", "hanging")
-                        .set("text-anchor", "middle")
-                        .set("transform", format!("rotate(-90, {x}, {y})")),
-                );
-            }
+
+            let label = zip(&y_facet, &faceting[Axis2::Y])
+                .map(|(value, series)| {
+                    if let Some(label) = &value.label {
+                        label.clone()
+                    } else {
+                        series.formatter.display(&value.value).to_string()
+                    }
+                })
+                .join(", ");
+            let x = x - 10.0 - y_axis_text_width - font_height;
+            let y = rect.0[Axis2::Y].midpoint();
+            graph_svg.append(
+                svg::node::element::Text::new(label)
+                    .set("x", x)
+                    .set("y", y)
+                    .set("dominant-baseline", "hanging")
+                    .set("text-anchor", "middle")
+                    .set("transform", format!("rotate(-90, {x}, {y})")),
+            );
+        }
+
+        if let Some(label) = &axis_domains[Axis3::Y].label {
+            let x = rect.0[Axis2::X].0 - 10.0 - y_axis_text_width - font_height;
+            let y = rect.0[Axis2::Y].midpoint();
+            graph_svg.append(
+                svg::node::element::Text::new(dbg!(label.text()))
+                    .set("x", x)
+                    .set("y", y)
+                    .set("dominant-baseline", "hanging")
+                    .set("text-anchor", "middle")
+                    .set("transform", format!("rotate(-90, {x}, {y})")),
+            );
         }
+
         for (x_index, x_facet) in x_facets.enumerate() {
             for (y_index, y_facet) in y_facets.clone().enumerate() {
                 let rect = rect.subrect(x_index, nx_facets, y_index, ny_facets);
@@ -5181,4 +5203,9 @@ mod tests {
     fn graph4() {
         test_graph_file("graph4");
     }
+
+    #[test]
+    fn graph5() {
+        test_graph_file("graph5");
+    }
 }
index a7d36d2a3a18e253499c6994ae8315939c1d7115..3631c6613195909cc9054404d547c3844dbb5d55 100644 (file)
@@ -137,8 +137,8 @@ impl DataSources {
                         }
                     }
                 }
-                assert_eq!(n_maps, count);
             }
+            assert_eq!(n_maps, count);
 
             (labels.len() as u32).write_le(&mut bin).unwrap();
             for (label, frequency) in &labels {
diff --git a/rust/pspp/src/spv/testdata/graph5.expected.svg b/rust/pspp/src/spv/testdata/graph5.expected.svg
new file mode 100644 (file)
index 0000000..56073e1
--- /dev/null
@@ -0,0 +1,200 @@
+<svg height="500" style="font-family: &quot;Sans Serif&quot;" viewBox="0 0 625 500" width="625" xmlns="http://www.w3.org/2000/svg">
+<g id="frame_data_1">
+<line stroke="black" x1="70.25" x2="342" y1="439" y2="439"/>
+<line stroke="black" x1="138.1875" x2="138.1875" y1="439" y2="449"/>
+<text dominant-baseline="hanging" text-anchor="middle" x="138.1875" y="449">
+
+</text>
+<line stroke="black" x1="274.0625" x2="274.0625" y1="439" y2="449"/>
+<text dominant-baseline="hanging" text-anchor="middle" x="274.0625" y="449">
+
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" x="206.125" y="472">
+Value of Variable 4
+</text>
+<line stroke="black" x1="347" x2="618.75" y1="439" y2="439"/>
+<line stroke="black" x1="414.9375" x2="414.9375" y1="439" y2="449"/>
+<text dominant-baseline="hanging" text-anchor="middle" x="414.9375" y="449">
+
+</text>
+<line stroke="black" x1="550.8125" x2="550.8125" y1="439" y2="449"/>
+<text dominant-baseline="hanging" text-anchor="middle" x="550.8125" y="449">
+
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" x="482.875" y="472">
+Value of Variable 4
+</text>
+<line stroke="black" x1="70.25" x2="70.25" y1="5" y2="109.75">
+<!-- Y axis 0 -->
+</line>
+<line stroke="black" x1="70.25" x2="60.25" y1="109.75" y2="109.75"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="109.75">
+.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="93.12301587301587" y2="93.12301587301587"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="93.12301587301587">
+1.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="76.49603174603175" y2="76.49603174603175"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="76.49603174603175">
+2.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="59.86904761904761" y2="59.86904761904761"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="59.86904761904761">
+3.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="43.242063492063494" y2="43.242063492063494"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="43.242063492063494">
+4.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="26.615079365079357" y2="26.615079365079357"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="26.615079365079357">
+5.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="9.988095238095232" y2="9.988095238095232"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="9.988095238095232">
+6.00
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" transform="rotate(-90, 6.25, 57.375)" x="6.25" y="57.375">
+4
+</text>
+<line stroke="black" x1="70.25" x2="70.25" y1="114.75" y2="219.5">
+<!-- Y axis 1 -->
+</line>
+<line stroke="black" x1="70.25" x2="60.25" y1="219.5" y2="219.5"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="219.5">
+.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="202.87301587301587" y2="202.87301587301587"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="202.87301587301587">
+1.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="186.24603174603175" y2="186.24603174603175"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="186.24603174603175">
+2.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="169.61904761904762" y2="169.61904761904762"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="169.61904761904762">
+3.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="152.9920634920635" y2="152.9920634920635"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="152.9920634920635">
+4.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="136.36507936507937" y2="136.36507936507937"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="136.36507936507937">
+5.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="119.73809523809523" y2="119.73809523809523"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="119.73809523809523">
+6.00
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" transform="rotate(-90, 6.25, 167.125)" x="6.25" y="167.125">
+5
+</text>
+<line stroke="black" x1="70.25" x2="70.25" y1="224.5" y2="329.25">
+<!-- Y axis 2 -->
+</line>
+<line stroke="black" x1="70.25" x2="60.25" y1="329.25" y2="329.25"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="329.25">
+.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="312.6230158730159" y2="312.6230158730159"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="312.6230158730159">
+1.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="295.99603174603175" y2="295.99603174603175"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="295.99603174603175">
+2.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="279.3690476190476" y2="279.3690476190476"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="279.3690476190476">
+3.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="262.7420634920635" y2="262.7420634920635"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="262.7420634920635">
+4.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="246.11507936507937" y2="246.11507936507937"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="246.11507936507937">
+5.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="229.48809523809524" y2="229.48809523809524"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="229.48809523809524">
+6.00
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" transform="rotate(-90, 6.25, 276.875)" x="6.25" y="276.875">
+7
+</text>
+<line stroke="black" x1="70.25" x2="70.25" y1="334.25" y2="439">
+<!-- Y axis 3 -->
+</line>
+<line stroke="black" x1="70.25" x2="60.25" y1="439" y2="439"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="439">
+.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="422.3730158730159" y2="422.3730158730159"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="422.3730158730159">
+1.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="405.74603174603175" y2="405.74603174603175"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="405.74603174603175">
+2.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="389.1190476190476" y2="389.1190476190476"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="389.1190476190476">
+3.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="372.4920634920635" y2="372.4920634920635"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="372.4920634920635">
+4.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="355.86507936507934" y2="355.86507936507934"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="355.86507936507934">
+5.00
+</text>
+<line stroke="black" x1="70.25" x2="60.25" y1="339.23809523809524" y2="339.23809523809524"/>
+<text dominant-baseline="middle" text-anchor="end" x="60.25" y="339.23809523809524">
+6.00
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" transform="rotate(-90, 6.25, 386.625)" x="6.25" y="386.625">
+6
+</text>
+<text dominant-baseline="hanging" text-anchor="middle" transform="rotate(-90, 6.25, 222)" x="6.25" y="222">
+Frequency
+</text>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="70.25" y="5"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="99.76190476190477" stroke="#000000" width="44.838750000000005" x="115.768125" y="9.988095238095232"/>
+<rect fill="#d3ce97" height="49.88095238095239" stroke="#000000" width="44.838750000000005" x="251.643125" y="59.86904761904761"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="70.25" y="114.75"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="99.76190476190477" stroke="#000000" width="44.838750000000005" x="115.768125" y="119.73809523809523"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="70.25" y="224.5"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="99.76190476190476" stroke="#000000" width="44.838750000000005" x="115.768125" y="229.48809523809524"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="70.25" y="334.25"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="49.88095238095241" stroke="#000000" width="44.838750000000005" x="251.643125" y="389.1190476190476"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="347" y="5"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="99.76190476190477" stroke="#000000" width="44.838750000000005" x="392.518125" y="9.988095238095232"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="347" y="114.75"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="99.76190476190477" stroke="#000000" width="44.838750000000005" x="392.518125" y="119.73809523809523"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="347" y="224.5"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="49.88095238095241" stroke="#000000" width="44.83874999999989" x="528.393125" y="279.3690476190476"/>
+</g>
+<rect fill="#f0f0f0" height="104.75" stroke="#000000" width="271.75" x="347" y="334.25"/>
+<g id="element_histogram_1">
+<rect fill="#d3ce97" height="99.76190476190476" stroke="#000000" width="44.838750000000005" x="392.518125" y="339.23809523809524"/>
+</g>
+</g>
+</svg>
diff --git a/rust/pspp/src/spv/testdata/graph5.xml b/rust/pspp/src/spv/testdata/graph5.xml
new file mode 100644 (file)
index 0000000..b3123bf
--- /dev/null
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<visualization xmlns="http://www.ibm.com/software/analytics/spss/xml/visualization" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="en" date="2019-05-08" description="Histogram of Kategorija" id="frame_graph_1" lang="en-US" style="frame_graph_1s" type="21000000" version="1.4" xsi:schemaLocation="http://www.ibm.com/software/analytics/spss/xml/visualization http://www.ibm.com/software/analytics/spss/xml/visualization/vizml-3.0.xsd">
+  <!-- Source: /home/blp/pspp/spv/spv/04488e072882e8f8b0c3c687e272d4af/00000000293_-4000816061397075370_chart.xml -->
+  <!--  Data  -->
+  <location method="fixed" part="left" value="0px" />
+  <location method="fixed" part="right" value="625px" />
+  <location method="fixed" part="top" value="0px" />
+  <location method="fixed" part="bottom" value="500px" />
+  <extension styleCycleRepository="styleCycleRepository" />
+  <embeddedSource id="source0">
+    <names>$WEIGHT;V11;V12;V4</names>
+    <types>double;double;double;double</types>
+    <row>5;101;4;101</row>
+    <row>4;101;5;101</row>
+    <row>2;101;7;101</row>
+    <row>1;102;4;101</row>
+    <row>7;102;5;101</row>
+    <row>4;102;6;101</row>
+    <row>5;101;4;102</row>
+    <row>1;101;6;102</row>
+    <row>10;102;7;102</row>
+  </embeddedSource>
+  <sourceVariable categorical="false" creator="external_datasource" id="variable4" key="false" shortLabel="V4" source="source0" sourceName="V4" weight="false">
+    <format hiddenseparator="false" minimumFractionDigits="2" minimumIntegerDigits="0" useGrouping="false" />
+  </sourceVariable>
+  <sourceVariable categorical="false" creator="internal_aggregate" id="variable5" key="false" label="Frequency" shortLabel="Frequency" source="source0" sourceName="$WEIGHT" weight="true" />
+  <sourceVariable categorical="true" creator="external_datasource" id="variable11" key="false" shortLabel="V11" source="source0" sourceName="V11" weight="false">
+    <format>
+      <relabel from="101" id="relabel_1270" to="Category 1" />
+      <relabel from="102" id="relabel_1271" to="Category 2" />
+    </format>
+  </sourceVariable>
+  <sourceVariable categorical="true" creator="external_datasource" id="variable12" key="false" shortLabel="V12" source="source0" sourceName="V12" weight="false" />
+  <!--  Structure  -->
+  <graph cellStyle="facetLabel_data_1s" id="frame_data_1" style="frame_data_1s">
+    <location method="fixed" part="left" value="1%" />
+    <location method="fixed" part="top" value="1%" />
+    <location method="fixed" part="bottom" value="99%" />
+    <location method="fixed" part="right" value="99%" />
+    <coordinates id="coordinates_1305">
+      <dimension id="dimension_1306" lowerMargin="5%" upperMargin="5%">
+        <axis combineAxisLabels="true" id="axis_axisx_1" repeat="never" style="axis_axisx_1s">
+          <label id="label_axisx_1" style="style_1312" textFrameStyle="style_1310">
+            <text id="text_1309">Value of Variable 4</text>
+          </label>
+          <majorTicks id="majorTicks_1314" markStyle="majorTicks_axis_axisx_1markStyle" stagger="false" style="style_1317" tickFrameStyle="style_1315" />
+        </axis>
+      </dimension>
+      <dimension id="dimension_1319" upperMargin="5%">
+        <axis combineAxisLabels="true" id="axis_axisy_1" repeat="never" style="axis_axisy_1s">
+          <label id="label_axisy_1" style="style_1325" textFrameStyle="style_1323">
+            <text id="text_1322">Frequency</text>
+          </label>
+          <majorTicks id="majorTicks_1327" markStyle="majorTicks_axis_axisy_1markStyle" stagger="false" style="style_1330" tickFrameStyle="style_1328" />
+        </axis>
+      </dimension>
+    </coordinates>
+    <faceting id="faceting_1332" method="cross">
+      <cross id="cross_1333">
+        <variableReference ref="variable11" />
+        <variableReference ref="variable12" />
+      </cross>
+    </faceting>
+    <facetLayout id="facetLayout_1336" topDown="true">
+      <facetLevel gap="2%" id="facetLabel_panel_1" level="1">
+        <axis id="axis_panel_1" opposite="true" repeat="never" style="axis_panel_1s">
+          <label id="label_panel_1" style="style_1343" textFrameStyle="style_1341">
+            <text id="text_1340">Variable 4</text>
+          </label>
+          <majorTicks id="majorTicks_1345" markStyle="majorTicks_axis_panel_1markStyle" stagger="false" style="style_1348" tickFrameStyle="style_1346" />
+        </axis>
+      </facetLevel>
+      <facetLevel gap="2%" id="facetLabel_panel_2" level="2">
+        <axis id="axis_panel_2" opposite="true" repeat="never" style="axis_panel_2s">
+          <label id="label_panel_2" style="style_1356" textFrameStyle="style_1354">
+            <text id="text_1353">Variable 12</text>
+          </label>
+          <majorTicks id="majorTicks_1358" labelAngle="90" markStyle="majorTicks_axis_panel_2markStyle" stagger="false" style="style_1361" tickFrameStyle="style_1359" />
+        </axis>
+      </facetLevel>
+    </facetLayout>
+    <interval dot="false" id="element_histogram_1" labelCollisionHandling="none" name="element_histogram_1" showCollidingLabels="true" style="element_histogram_1s">
+      <binStatistic id="binStatistic_1364" />
+      <summaryStatistic id="summaryStatistic_1365" method="count" />
+      <x variable="variable4" />
+    </interval>
+  </graph>
+  <!--  Styles  -->
+  <style font-family="SansSerif" font-size="8pt;6pt;" id="c-o-n-t-a-i-n-er" pattern="0" stroke-linecap="butt" text-fit="true">
+    <style color="white" color2="transparent" id="frame_graph_1s" />
+    <style color="transparent" color2="transparent" id="frame_data_1s" />
+    <style color="#F0F0F0" color2="black" id="facetLabel_data_1s" />
+    <style color="black" id="axis_axisx_1s" stroke-width="0.5pt" />
+    <style id="axis_axisx_1baselineStyle" />
+    <style color="black" id="majorTicks_axis_axisx_1markStyle" stroke-width="1pt" />
+    <style id="majorTicks_axis_axisx_1tickLabelStyle" />
+    <style color="black" id="axis_axisy_1s" stroke-width="0.5pt" />
+    <style id="axis_axisy_1baselineStyle" />
+    <style color="black" id="majorTicks_axis_axisy_1markStyle" stroke-width="1pt" />
+    <style id="majorTicks_axis_axisy_1tickLabelStyle" />
+    <style color="#D3CE97" color2="black" depth="75%" id="element_histogram_1s" pattern="0" width="100%" />
+    <style id="label_axisx_1s" />
+    <style id="label_axisy_1s" />
+    <style color="transparent" id="axis_panel_1s" />
+    <style id="axis_panel_1baselineStyle" />
+    <style id="label_panel_1s" />
+    <style id="majorTicks_axis_panel_1markStyle" visible="false" />
+    <style id="majorTicks_axis_panel_1tickLabelStyle" />
+    <style color="transparent" id="axis_panel_2s" />
+    <style id="axis_panel_2baselineStyle" />
+    <style id="label_panel_2s" />
+    <style id="majorTicks_axis_panel_2markStyle" visible="false" />
+    <style id="majorTicks_axis_panel_2tickLabelStyle" />
+    <style id="style_1310" visible="false" />
+    <style color="black" color2="transparent" font-size="11pt;7pt" font-weight="bold" id="style_1312" margin="6px" padding="1px" />
+    <style id="style_1315" visible="false" />
+    <style color="black" font-size="8pt;6pt;" id="style_1317" />
+    <style id="style_1323" visible="false" />
+    <style color="black" color2="transparent" font-size="11pt;7pt" font-weight="bold" id="style_1325" margin="6px" padding="1px" />
+    <style id="style_1328" visible="false" />
+    <style color="black" font-size="8pt;6pt;" id="style_1330" />
+    <style color="transparent" color2="transparent" id="style_1341" />
+    <style color="black" color2="transparent" font-size="11pt;7pt" font-weight="bold" id="style_1343" margin="6px" padding="1px" />
+    <style color="transparent" color2="transparent" id="style_1346" />
+    <style color="black" color2="transparent" font-size="11pt;7pt;" font-weight="bold" id="style_1348" margin="2px" padding="1px" />
+    <style color="transparent" color2="transparent" id="style_1354" />
+    <style color="black" color2="transparent" font-size="11pt;7pt" font-weight="bold" id="style_1356" margin="6px" padding="1px" />
+    <style color="transparent" color2="transparent" id="style_1359" />
+    <style color="black" color2="transparent" font-size="11pt;7pt;" font-weight="bold" id="style_1361" margin="2px" padding="1px" />
+  </style>
+  <!--  Style Cycles  -->
+  <styleCycle id="styleCycleDefault">
+    <cycle id="cycle_1298">
+      <style id="style_styleCycleDefault" labelInside="preferred" />
+    </cycle>
+  </styleCycle>
+  <styleCycle id="styleCycleRepository">
+    <cycle>
+      <style color="#3E58AC" />
+      <style color="#2EB848" />
+      <style color="#D3CE97" />
+      <style color="#7C287D" />
+      <style color="#FBF873" />
+      <style color="#EF3338" />
+      <style color="#48C2C5" />
+      <style color="#CCCCCC" />
+      <style color="#7AAAD5" />
+      <style color="#0A562C" />
+      <style color="#F8981D" />
+      <style color="#DDBAF1" />
+      <style color="#1A5F76" />
+      <style color="#CCFFCC" />
+      <style color="#BB3F7F" />
+      <style color="#999999" />
+      <style color="#000000" />
+      <style color="#B6E7E8" />
+      <style color="#FFFFFF" />
+      <style color="#797AA7" />
+      <style color="#70DC84" />
+      <style color="#333333" />
+      <style color="#ACD0EE" />
+      <style color="#A21619" />
+      <style color="#5D61FF" />
+      <style color="#E4E4E4" />
+      <style color="#248BAC" />
+      <style color="#B89BC9" />
+      <style color="#666666" />
+      <style color="#0D8D46" />
+    </cycle>
+    <cycle>
+      <style pattern="0" />
+      <style pattern="26" />
+      <style pattern="1" />
+      <style pattern="12" />
+      <style pattern="3" />
+      <style pattern="29" />
+      <style pattern="6" />
+      <style pattern="14" />
+      <style pattern="7" />
+      <style pattern="18" />
+      <style pattern="17" />
+      <style pattern="22" />
+      <style pattern="9" />
+      <style pattern="20" />
+      <style pattern="10" />
+      <style pattern="21" />
+      <style pattern="27" />
+      <style pattern="19" />
+      <style pattern="23" />
+      <style pattern="13" />
+      <style pattern="4" />
+      <style pattern="25" />
+      <style pattern="28" />
+      <style pattern="5" />
+      <style pattern="15" />
+      <style pattern="2" />
+      <style pattern="24" />
+      <style pattern="11" />
+      <style pattern="16" />
+      <style pattern="8" />
+    </cycle>
+    <cycle>
+      <style size="5pt" symbol="circle" />
+      <style size="5pt" symbol="square" />
+      <style size="5pt" symbol="cross" />
+      <style glyph-sides="3" size="5pt" symbol="polygon" />
+      <style size="5pt" symbol="plus" />
+      <style glyph-angle="90" glyph-aspect="0.5" size="5pt" symbol="circle" />
+      <style glyph-angle="45" size="5pt" symbol="square" />
+      <style glyph-sides="5" size="5pt" symbol="flower" />
+      <style size="5pt" symbol="bowtie" />
+      <style glyph-angle="90" glyph-aspect="0.5" size="5pt" symbol="square" />
+      <style glyph-angle="180" glyph-sides="3" size="5pt" symbol="polygon" />
+      <style glyph-aspect="0.5" size="5pt" symbol="circle" />
+      <style glyph-sides="5" size="5pt" symbol="polygon" />
+      <style glyph-sides="8" size="5pt" symbol="star" />
+      <style glyph-aspect="0.5" size="5pt" symbol="square" />
+      <style glyph-sides="3" size="5pt" symbol="flower" />
+      <style glyph-angle="90" size="5pt" symbol="bowtie" />
+      <style glyph-angle="90" size="5pt" symbol="line" />
+      <style glyph-angle="90" glyph-aspect="0.5" glyph-sides="4" size="5pt" symbol="polygon" />
+      <style size="5pt" symbol="line" />
+      <style glyph-angle="270" glyph-sides="3" size="5pt" symbol="polygon" />
+      <style size="5pt" symbol="arrow" />
+      <style glyph-angle="90" glyph-sides="3" size="5pt" symbol="polygon" />
+    </cycle>
+    <cycle>
+      <style />
+      <style stroke-dasharray="12pt,2pt,2pt,10pt,2pt,2pt" />
+      <style stroke-dasharray="8pt,8pt" />
+      <style stroke-dasharray="10pt,2pt,2pt,2pt" />
+      <style stroke-dasharray="3pt,6pt" />
+      <style stroke-dasharray="12pt,2pt,2pt,2pt,2pt,2pt,2pt,2pt" />
+      <style stroke-dasharray="6pt,3pt,6pt" />
+      <style stroke-dasharray="8pt,1pt,8pt,7pt,2pt,7pt" />
+      <style stroke-dasharray="6pt,2pt,3pt,5pt,2pt,2pt" />
+      <style stroke-dasharray="15pt,2pt,6pt,2pt" />
+      <style stroke-dasharray="5pt,5pt" />
+      <style stroke-dasharray="8pt,2pt,4pt,2pt" />
+      <style stroke-dasharray="3pt,2pt" />
+      <style stroke-dasharray="12pt,5pt,3pt,5pt" />
+      <style stroke-dasharray="6pt,3pt,3pt,3pt" />
+      <style stroke-dasharray="12pt,3pt" />
+    </cycle>
+  </styleCycle>
+</visualization>