Spaces:
Sleeping
Sleeping
File size: 2,533 Bytes
bc7b615 4d40aeb bc7b615 4d40aeb bc7b615 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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
|