Proportional Area Chart
Chart overview
Proportional area charts represent values using shapes (typically squares or circles) where the area is proportional to the data value.
Key points
- They provide intuitive size comparisons but require careful design since humans don't accurately perceive area differences.
- The cardinal error is scaling the radius or side length by the value, which inflates the visual ratio quadratically - a 2x value becomes a 4x area; always scale so that area itself is proportional (radius proportional to the square root of the value) and say so in the caption.
- Even done correctly, perception research (Cleveland and McGill) puts area near the bottom of the accuracy hierarchy - readers systematically underestimate large-to-small ratios - so treat the form as a headline visual for 'A is much bigger than B' messages, never for values within about 30% of each other, and print the numbers inside or beside each shape.
Practical guidance
In matplotlib, draw circles with scatter(s=... ) - s is already in area units (points squared), which makes correct scaling easy - or with patches. Circle on an equal-aspect axis. Side-by-side squares read slightly more accurately than circles; nested shapes are harder still. Two or three shapes make a strong comparison; a dozen make a bubble field where a plain bar chart would be strictly better. If precise comparison is the job, the bar chart wins every time.
Create a Proportional Area Chart with your data using AI — no coding required.
Python Tutorial
How to create a proportional area chart in Python
Use the full tutorial for implementation details, troubleshooting, and chart variations in matplotlib, seaborn, and plotly.
How to Create a Bar Chart in PythonExample Visualization

Create This Chart Now
Generate publication-ready proportional area charts with AI in seconds. No coding required – just describe your data and let AI do the work.
View example prompt
"Create a proportional area chart using squares to compare 'Land Area of Countries' for the 10 largest nations. Generate accurate data in million km²: Russia (17.1), Canada (10.0), USA (9.8), China (9.6), Brazil (8.5), Australia (7.7), India (3.3), Argentina (2.8), Kazakhstan (2.7), Algeria (2.4). Size each square proportionally to land area (area, not side length). Arrange squares in a treemap-style layout for space efficiency. Color by continent: North America (blue), South America (green), Europe/Asia (orange), Oceania (purple), Africa (brown). Label each square with country name and area. Include a scale indicator showing what area represents 1M km². Add total world land area (150M km²) and percentage of world for each country. Title: 'World's Largest Countries by Land Area'."
How to create this chart in 30 seconds
Upload Data
Drag & drop your Excel or CSV file. Plotivy securely processes it in your browser.
AI Generation
Our AI analyzes your data and generates the Proportional Area Chart code automatically.
Customize & Export
Tweak the design with natural language, then export as high-res PNG, SVG or PDF.
Newsletter
Get one weekly tip for better proportional area charts
Join researchers receiving concise Python plotting techniques to improve chart clarity and reduce revision cycles.
Python Code Example
# === IMPORTS ===
import pandas as pd
import matplotlib.pyplot as plt
import squarify
# === USER-EDITABLE PARAMETERS ===
# Change: Modify these lists to update countries and their land areas (in km²)
countries = [
'Russia', 'Canada', 'United States', 'China', 'Brazil', 'Australia',
'India', 'Argentina', 'Kazakhstan', 'Algeria'
]
land_areas = [
17098242, 9984670, 9833517, 9596961, 8515767, 7692024,
3287263, 2780400, 2724902, 2381741
]
# Change: Customize figure size (width, height in inches)
figsize = (12, 8)
# Change: List of hex colors for categorical groups (add more if needed, limit to 10 for visibility)
colors = [
'#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd',
'#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'
]
# Change: Font sizes for title (larger) and general elements
title_fontsize = 18
label_fontsize = 16 # Used for any text labels if added
# Change: Toggle to show percentages in labels (True/False)
show_percentages = True
# Change: Alpha (transparency) for squares, 0.6-0.9 recommended for overlaps
alpha = 0.8
# Data preparation
# Create DataFrame from example data
df = pd.DataFrame({'Countries': countries, 'Land Area': land_areas})
# Sort by land area descending for proper largest-first layout
df = df.sort_values('Land Area', ascending=False).reset_index(drop=True)
# Calculate total and percentages for insights
total_area = df['Land Area'].sum()
df['Percentage'] = (df['Land Area'] / total_area * 100).round(1)
# Print relevant data values
print("Top 10 countries by land area (km²) and share of total:")
print(df[['Countries', 'Land Area', 'Percentage']].round({'Land Area': 0}))
print(f"\nTotal land area in dataset: {total_area:,.0f} km²")
print(f"Largest country ({df['Countries'].iloc[0]}) share: {df['Percentage'].iloc[0]:.1f}%")
# Create insight-driven title
largest_country = df['Countries'].iloc[0]
largest_share = df['Percentage'].iloc[0]
insight_title = f"{largest_country} dominates with {largest_share:.1f}% of total land area among top 10 countries"
# Create plot
fig, ax = plt.subplots(figsize=figsize)
# Prepare labels: country name + optional percentage
if show_percentages:
labels = [f"{country}\n{perc:.1f}%" for country, perc in zip(df['Countries'], df['Percentage'])]
else:
labels = df['Countries'].tolist()
# Generate proportional squares using squarify (areas exactly proportional to land area)
squarify.plot(
sizes=df['Land Area'],
label=labels,
color=colors[:len(df)],
alpha=alpha,
ax=ax,
bar_kwargs={'linewidth': 2, 'edgecolor': 'white'} # Change: Add white edges for separation
)
# Customize title with insight
ax.set_title(insight_title, fontsize=title_fontsize, pad=20, weight='bold')
# Remove axes for clean proportional area view
plt.axis('off')
# Adjust layout to prevent clipping (title, labels)
plt.subplots_adjust(top=0.92)
plt.tight_layout()
# Assign final plot to fig (required)
fig
# Display the plot
plt.show()
# END-OF-CODEOpens the Analyze page with this code pre-loaded and ready to execute
Console Output
Total land area (top 10): 73.9 million sq km Russia share: 23.1%
Common Use Cases
- 1Size comparison infographics
- 2Scale visualization
- 3Magnitude relationships
- 4Educational displays
Pro Tips
Add exact values as labels
Scale areas, not dimensions
Use consistent shapes
Frequently asked questions
When should you use a proportional area chart?
Proportional area charts represent values using shapes (typically squares or circles) where the area is proportional to the data value. They provide intuitive size comparisons but require careful design since humans don't accurately perceive area differences. Common applications include size comparison infographics, scale visualization, and magnitude relationships.
Which Python libraries can create a proportional area chart?
A proportional area chart can be built in Python with matplotlib — matplotlib for precise control over axes, annotations, and journal styling. In Plotivy you describe the figure and it writes the matplotlib code for you.
Can I make a proportional area chart without writing Python code?
Yes. Describe the proportional area chart you need in plain language and upload your dataset — Plotivy's AI writes the Python code and renders a publication-ready figure. You still get the full, editable matplotlib source, so nothing is locked in a black box.
What are best practices for a clear proportional area chart?
Add exact values as labels. Scale areas, not dimensions.
Long-tail keyword opportunities
High-intent chart variations
Library comparison for this chart
matplotlib
Best when you need full control over axis formatting, annotation placement, and journal-specific styling for proportional-area-chart.
Scientific Chart Selection Cheat Sheet
Not sure whether to use a Violin Plot, Box Plot, or Ridge Plot? Download our single-page reference mapping the most-used scientific chart types, exactly when to use them, and the core Matplotlib/Seaborn functions.