Spacegroup Bar Plot
Visualize crystallographic space group distributions with automatic crystal system coloring and annotations.
Basic Usage with Interactive Controls
Pass space group numbers (1-230) to visualize their distribution with automatic crystal system coloring and region annotations:
Tip: Hover over any bar to see space group number, crystal system, and count.
Click and drag to zoom into specific regions. Double-click to reset.
svelte<script lang="ts">
import { SpacegroupBarPlot } from 'matterviz'
// Sample data: space group numbers from a materials database
// oxfmt-ignore
const diverse_materials = [
221,
221,
221, // Cubic perovskites
225,
225,
225,
225,
225,
229,
229,
229, // Cubic metals
194,
194,
194,
194, // Hexagonal metals
167,
167,
166, // Trigonal
139,
129,
123,
123, // Tetragonal
62,
62,
62,
62,
62,
62,
59,
61,
63, // Orthorhombic
15,
15,
15,
14,
14,
14,
14,
12,
11, // Monoclinic
2,
2,
1, // Triclinic
]
let show_counts = $state(true)
</script>
<div
style="margin-bottom: 1em; padding: 8pt; background: rgba(255, 255, 255, 0.05); border-radius: 4px"
>
<strong>Tip:</strong> Hover over any bar to see space group number, crystal system, and count.
Click and drag to zoom into specific regions. Double-click to reset.
</div>
<label style="margin-bottom: 1em; display: block">
<input type="checkbox" bind:checked={show_counts} />
Show count annotations
</label>
<SpacegroupBarPlot data={diverse_materials} {show_counts} style="height: 450px" />Space Group Symbols
The component also accepts space group symbols (Hermann-Mauguin notation):
svelte<script lang="ts">
import { SpacegroupBarPlot } from 'matterviz'
// oxfmt-ignore
const spacegroups_symbols = [
'Fm-3m',
'Fm-3m',
'Fd-3m',
'Im-3m',
'Fm-3m', // Cubic
'P63/mmc',
'P63/mmc',
'P63mc',
'P6/mmm', // Hexagonal
'R-3m',
'R-3c',
'R-3m',
'R-3', // Trigonal
'I4/mmm',
'P4/mmm',
'I4/mmm',
'P4/nmm', // Tetragonal
'Pnma',
'Cmcm',
'Pbca',
'Pnma',
'Pnma',
'Cmcm', // Orthorhombic
'C2/c',
'P21/c',
'C2/m',
'P21/c',
'C2/c', // Monoclinic
'P-1',
'P1',
'P-1', // Triclinic
]
</script>
<SpacegroupBarPlot data={spacegroups_symbols} style="height: 450px" />Horizontal Orientation
Display spacegroup distributions horizontally:
svelte<script lang="ts">
import { SpacegroupBarPlot } from 'matterviz'
// oxfmt-ignore
const high_symmetry = [
225,
225,
225,
225,
225,
225,
225,
225,
225,
225, // Fm-3m
229,
229,
229,
229,
229,
229, // Im-3m
227,
227,
227,
227,
227, // Fd-3m
221,
221,
221,
221,
221,
221,
221,
221, // Pm-3m
194,
194,
194,
194,
194,
194, // P63/mmc
166,
166,
166,
166,
166, // R-3m
139,
139,
139,
139, // I4/mmm
62,
62,
62,
62,
62,
62,
62,
62, // Pnma
]
let orientation = $state('vertical')
let plot_style = $derived(orientation === 'horizontal' ? `height: 700px` : `height: 450px`)
</script>
<div style="margin-bottom: 1em; display: flex; gap: 1em; align-items: center">
<label style="display: flex; align-items: center; gap: 4px"
><input type="radio" bind:group={orientation} value="vertical" /> Vertical</label
>
<label style="display: flex; align-items: center; gap: 4px"
><input type="radio" bind:group={orientation} value="horizontal" /> Horizontal</label
>
</div>
<SpacegroupBarPlot data={high_symmetry} {orientation} style={plot_style} />Real-World Example: Materials Project Data
Simulated space group distributions from Materials Project database:
Dataset: 426 materials with distribution resembling real materials databases. Notice how
certain space groups like 225 (Fm-3m), 62 (Pnma), and 14/15 (monoclinic) are much more common.
svelte<script lang="ts">
import { SpacegroupBarPlot } from 'matterviz'
// Simulated distribution resembling Materials Project statistics
// Based on typical prevalence: more orthorhombic and monoclinic, fewer triclinic
const generate_distribution = () => {
const data = []
// Triclinic (1-2): ~1-2% of materials
for (let idx = 0; idx < 8; idx++) data.push(Math.random() < 0.7 ? 2 : 1)
// Monoclinic (3-15): ~20-25% of materials, especially 14 and 15
for (let idx = 0; idx < 100; idx++) {
const sg =
Math.random() < 0.6
? Math.random() < 0.5
? 14
: 15
: Math.floor(Math.random() * 13) + 3
data.push(sg)
}
// Orthorhombic (16-74): ~30-35% of materials, especially 62, 63
for (let idx = 0; idx < 140; idx++) {
const sg =
Math.random() < 0.5
? Math.random() < 0.5
? 62
: 63
: Math.floor(Math.random() * 59) + 16
data.push(sg)
}
// Tetragonal (75-142): ~10-15% of materials
for (let idx = 0; idx < 50; idx++) {
data.push(Math.floor(Math.random() * 68) + 75)
}
// Trigonal (143-167): ~5-8% of materials, R-3 family common
for (let idx = 0; idx < 30; idx++) {
const sg =
Math.random() < 0.4
? Math.random() < 0.5
? 148
: 166
: Math.floor(Math.random() * 25) + 143
data.push(sg)
}
// Hexagonal (168-194): ~5-8% of materials, P63/mmc common
for (let idx = 0; idx < 28; idx++) {
const sg = Math.random() < 0.4 ? 194 : Math.floor(Math.random() * 27) + 168
data.push(sg)
}
// Cubic (195-230): ~15-20% of materials, Fm-3m very common
for (let idx = 0; idx < 70; idx++) {
const sg =
Math.random() < 0.4
? 225
: Math.random() < 0.3
? 229
: Math.floor(Math.random() * 36) + 195
data.push(sg)
}
return data
}
const materials_db = generate_distribution()
</script>
<div
style="margin-bottom: 1em; padding: 8pt; background: rgba(255, 255, 255, 0.05); border-radius: var(--border-radius); font-size: 0.9em"
>
<strong>Dataset:</strong>
{materials_db.length} materials with distribution resembling real materials databases. Notice how
certain space groups like 225 (Fm-3m), 62 (Pnma), and 14/15 (monoclinic) are much more common.
</div>
<SpacegroupBarPlot data={materials_db} style="height: 500px" />