Saturday, June 28, 2025

From Default Python Line Chart to Journal-High quality Infographics | by Vladimir Zhyvov | Dec, 2024


Remodel boring default Matplotlib line charts into beautiful, custom-made visualizations

Cowl, picture by the Creator

Everybody who has used Matplotlib is aware of how ugly the default charts appear like. On this sequence of posts, I’ll share some tips to make your visualizations stand out and replicate your particular person fashion.

We’ll begin with a easy line chart, which is extensively used. The primary spotlight will probably be including a gradient fill beneath the plot — a activity that’s not totally simple.

So, let’s dive in and stroll by all the important thing steps of this transformation!

Let’s make all the required imports first.

import pandas as pd
import numpy as np
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib import rcParams
from matplotlib.path import Path
from matplotlib.patches import PathPatch

np.random.seed(38)

Now we have to generate pattern knowledge for our visualization. We are going to create one thing just like what inventory costs appear like.

dates = pd.date_range(begin='2024-02-01', intervals=100, freq='D')
initial_rate = 75
drift = 0.003
volatility = 0.1
returns = np.random.regular(drift, volatility, len(dates))
charges = initial_rate * np.cumprod(1 + returns)

x, y = dates, charges

Let’s test the way it seems to be with the default Matplotlib settings.

repair, ax = plt.subplots(figsize=(8, 4))
ax.plot(dates, charges)
ax.xaxis.set_major_locator(mdates.DayLocator(interval=30))
plt.present()
Default plot, picture by Creator

Not likely fascination, proper? However we are going to step by step make it trying higher.

  • set the title
  • set basic chart parameters — measurement and font
  • inserting the Y ticks to the fitting
  • altering the principle line colour, fashion and width
# Common parameters
fig, ax = plt.subplots(figsize=(10, 6))
plt.title("Day by day guests", fontsize=18, colour="black")
rcParams['font.family'] = 'DejaVu Sans'
rcParams['font.size'] = 14

# Axis Y to the fitting
ax.yaxis.tick_right()
ax.yaxis.set_label_position("proper")

# Plotting primary line
ax.plot(dates, charges, colour='#268358', linewidth=2)

Common params utilized, picture by Creator

Alright, now it seems to be a bit cleaner.

Now we’d like so as to add minimalistic grid to the background, take away borders for a cleaner look and take away ticks from the Y axis.

# Grid
ax.grid(colour="grey", linestyle=(0, (10, 10)), linewidth=0.5, alpha=0.6)
ax.tick_params(axis="x", colours="black")
ax.tick_params(axis="y", left=False, labelleft=False)

# Borders
ax.spines["top"].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines["bottom"].set_color("black")
ax.spines['left'].set_color('white')
ax.spines['left'].set_linewidth(1)

# Take away ticks from axis Y
ax.tick_params(axis='y', size=0)

Grid added, picture by Creator

Now we’re including a tine esthetic element — 12 months close to the primary tick on the axis X. Additionally we make the font colour of tick labels extra pale.

# Add 12 months to the primary date on the axis
def custom_date_formatter(t, pos, dates, x_interval):
date = dates[pos*x_interval]
if pos == 0:
return date.strftime('%d %b '%y')
else:
return date.strftime('%d %b')
ax.xaxis.set_major_formatter(ticker.FuncFormatter((lambda x, pos: custom_date_formatter(x, pos, dates=dates, x_interval=x_interval))))

# Ticks label colour
[t.set_color('#808079') for t in ax.yaxis.get_ticklabels()]
[t.set_color('#808079') for t in ax.xaxis.get_ticklabels()]

Yr close to first date, picture by Creator

And we’re getting nearer to the trickiest second — tips on how to create a gradient beneath the curve. Really there isn’t a such choice in Matplotlib, however we are able to simulate it making a gradient picture after which clipping it with the chart.

# Gradient
numeric_x = np.array([i for i in range(len(x))])
numeric_x_patch = np.append(numeric_x, max(numeric_x))
numeric_x_patch = np.append(numeric_x_patch[0], numeric_x_patch)
y_patch = np.append(y, 0)
y_patch = np.append(0, y_patch)

path = Path(np.array([numeric_x_patch, y_patch]).transpose())
patch = PathPatch(path, facecolor='none')
plt.gca().add_patch(patch)

ax.imshow(numeric_x.reshape(len(numeric_x), 1), interpolation="bicubic",
cmap=plt.cm.Greens,
origin='decrease',
alpha=0.3,
extent=[min(numeric_x), max(numeric_x), min(y_patch), max(y_patch) * 1.2],
side="auto", clip_path=patch, clip_on=True)

Gradient added, picture by Creator

Now it seems to be clear and good. We simply want so as to add a number of particulars utilizing any editor (I choose Google Slides) — title, spherical border corners and a few numeric indicators.

Last visualization, picture by Creator

The total code to breed the visualization is beneath:

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles

PHP Code Snippets Powered By : XYZScripts.com