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