Spaces:
Sleeping
Sleeping
import matplotlib.pyplot as plt | |
import numpy as np | |
import pandas as pd | |
# Ensures reproducibility of random numbers | |
rng = np.random.default_rng(123) | |
# Build a dataset | |
# df = pd.DataFrame({ | |
# "name": [f"item {i}" for i in range(1, 51)], | |
# "value": rng.integers(low=30, high=100, size=50), | |
# "group": ["A"] * 10 + ["B"] * 20 + ["C"] * 12 + ["D"] * 8 | |
# }) | |
unfiltered_spaces_with_outliers = pd.read_csv('hugging_face_spaces.csv') | |
spaces = unfiltered_spaces_with_outliers[unfiltered_spaces_with_outliers['likes'] >= 3] | |
df = spaces.sort_values('likes', ascending=False).iloc[1:51][['repo_id', 'likes', 'sdk']] | |
df['likes'] = df['likes'] / 5 | |
df = df.sample(frac=1) | |
# df.to_csv('x.csv') | |
def get_label_rotation(angle, offset): | |
# Rotation must be specified in degrees :( | |
rotation = np.rad2deg(angle + offset) | |
if angle <= np.pi: | |
alignment = "right" | |
rotation = rotation + 180 | |
else: | |
alignment = "left" | |
return rotation, alignment | |
def add_labels(angles, values, labels, offset, ax): | |
padding = 4 | |
for angle, value, label, in zip(angles, values, labels): | |
angle = angle | |
rotation, alignment = get_label_rotation(angle, offset) | |
ax.text(x=angle, y=value + padding, s=label, size=11, ha=alignment, va="center", rotation=rotation, rotation_mode="anchor") | |
def get_plot(): | |
ANGLES = np.linspace(0, 2 * np.pi, len(df), endpoint=False) | |
VALUES = df["likes"].values | |
LABELS = df["repo_id"].values | |
# Determine the width of each bar. | |
# The circumference is '2 * pi', so we divide that total width over the number of bars. | |
WIDTH = 2 * np.pi / len(VALUES) | |
# Determines where to place the first bar. | |
# By default, matplotlib starts at 0 (the first bar is horizontal) | |
# but here we say we want to start at pi/2 (90 deg) | |
OFFSET = np.pi / 2 | |
# Initialize Figure and Axis | |
fig, ax = plt.subplots(figsize=(20, 22), subplot_kw={"projection": "polar"}) | |
# Specify offset | |
ax.set_theta_offset(OFFSET) | |
# Set limits for radial (y) axis. The negative lower bound creates the whole in the middle. | |
ax.set_ylim(-100, df['likes'].max()) | |
# Remove all spines | |
ax.set_frame_on(False) | |
# Remove grid and tick marks | |
ax.xaxis.grid(False) | |
ax.yaxis.grid(False) | |
ax.set_xticks([]) | |
ax.set_yticks([]) | |
# Add bars | |
ax.bar( | |
ANGLES, VALUES, width=WIDTH, linewidth=2, | |
color="#61a4b2", edgecolor="white" | |
) | |
# Add labels | |
add_labels(ANGLES, VALUES, LABELS, OFFSET, ax) | |
return fig | |