Skip to main content
v2.2

Box Plot (Box and whiskers)

Box PlotBox Plot
import numpy as np
import lightningchart as lc

# Set the license key
lc.set_license('my-license-key')

# Define categories and their data
categories = [
'temperature',
'windspeed',
'sigheight',
'humidity',
'feelslike',
'swellheight',
]
category_data = {
'temperature': np.random.normal(20, 5, 100).tolist(), # Random data for temperature
'windspeed': np.random.normal(15, 8, 100).tolist(), # Random data for windspeed
'sigheight': np.random.normal(2, 0.5, 100).tolist(), # Random data for sigheight
'humidity': np.random.normal(70, 15, 100).tolist(), # Random data for humidity
'feelslike': np.random.normal(18, 6, 100).tolist(), # Random data for feelslike
'swellheight': np.random.normal(
1, 0.3, 100
).tolist(), # Random data for swellheight
}

# Create a chart
chart = lc.ChartXY(theme=lc.Themes.Light, title='Box Plot')

# Prepare box plot data
dataset = []
x_values_outlier = []
y_values_outlier = []

for i, category in enumerate(categories):
column_data = category_data[category]

start = (i * 2) + 1
end = start + 1
lowerQuartile = float(np.percentile(column_data, 25))
upperQuartile = float(np.percentile(column_data, 75))
median = float(np.median(column_data))
# Calculate IQR and identify outliers
iqr = upperQuartile - lowerQuartile
lower_bound = lowerQuartile - 1.5 * iqr
upper_bound = upperQuartile + 1.5 * iqr

# Filter non-outliers for whisker bounds
non_outliers = [y for y in column_data if lower_bound <= y <= upper_bound]
lowerExtreme = float(min(non_outliers))
upperExtreme = float(max(non_outliers))

dataset.append({
'start': start,
'end': end,
'lowerQuartile': lowerQuartile,
'upperQuartile': upperQuartile,
'median': median,
'lowerExtreme': lowerExtreme,
'upperExtreme': upperExtreme,
})

# Calculate IQR and identify outliers
iqr = upperQuartile - lowerQuartile
lower_bound = lowerQuartile - 1.5 * iqr
upper_bound = upperQuartile + 1.5 * iqr
outliers = [y for y in column_data if y < lower_bound or y > upper_bound]

for outlier in outliers:
x_values_outlier.append(start + 0.5)
y_values_outlier.append(outlier)

# Add box series to the chart
series = chart.add_box_series()
series.add_multiple(dataset)

# Add outliers to the chart
outlier_series = chart.add_point_series(sizes=True, rotations=True, lookup_values=True)
outlier_series.set_point_color(('red'))
outlier_series.append_samples(
x_values=x_values_outlier,
y_values=y_values_outlier,
sizes=[10] * len(y_values_outlier),
)

# Configure X-axis with category labels
x_axis = chart.get_default_x_axis()
x_axis.set_title("Categories")
x_axis.set_interval(0, len(categories) * 2 + 1)

# Remove default numeric ticks and add custom category labels
x_axis.set_tick_strategy('Empty')

for i, category in enumerate(categories):
center = (i * 2) + 1.5
tick = x_axis.add_custom_tick()
tick.set_value(center)
tick.set_text(category)

chart.get_default_y_axis().set_title("Value")

chart.open()