Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Data
data = {
    'Subjek': [f'S{i}' for i in range(1, 121)],
    '1.1': [3, 3, 4, 3, 3, 5, 5, 4, 2, 3, 5, 2, 3, 3, 2, 5, 4, 5, 2, 2, 4, 5, 4, 4, 3, 5, 2, 3, 5, 4, 3, 4, 2, 4, 2, 5, 3, 4, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 3, 2, 3, 2, 4, 3, 4, 5, 3, 5, 5, 5, 2, 2, 3, 5, 3, 4, 2, 3, 4, 5, 5, 4, 3, 2, 2, 3, 2, 3, 2, 4, 5, 2, 4, 5, 4, 3, 2, 3, 3, 3, 5, 2, 5, 3, 5, 5, 2, 5, 2, 3, 3, 2, 5, 2, 3, 3, 2, 5, 2, 4, 2, 4, 5, 3, 5, 5, 3, 5, 4, 2],
    '1.2': [2, 5, 4, 2, 2, 3, 2, 2, 2, 3, 5, 2, 4, 5, 2, 5, 2, 2, 3, 3, 3, 4, 4, 2, 3, 5, 3, 4, 2, 2, 4, 3, 3, 2, 3, 5, 3, 3, 2, 3, 5, 4, 5, 3, 4, 2, 4, 2, 5, 2, 2, 5, 2, 3, 2, 2, 2, 2, 2, 4, 4, 3, 5, 3, 5, 3, 3, 2, 3, 2, 2, 4, 4, 5, 4, 3, 5, 5, 5, 2, 5, 3, 2, 4, 3, 3, 4, 3, 4, 4, 2, 2, 3, 5, 3, 2, 2, 2, 4, 5, 5, 2, 4, 3, 2, 5, 4, 4, 2, 3, 4, 2, 3, 2, 3, 3, 2, 4, 2, 2],
    '1.3': [2, 2, 3, 3, 5, 5, 4, 2, 2, 5, 2, 5, 3, 5, 4, 4, 2, 2, 2, 3, 5, 2, 2, 2, 5, 3, 4, 2, 4, 3, 2, 3, 4, 3, 4, 5, 4, 3, 4, 5, 4, 5, 4, 2, 4, 5, 4, 5, 2, 5, 3, 4, 2, 5, 2, 5, 3, 5, 3, 4, 4, 4, 5, 2, 5, 4, 2, 5, 3, 5, 2, 2, 3, 4, 3, 5, 2, 3, 4, 2, 4, 3, 3, 4, 5, 2, 4, 4, 5, 4, 4, 5, 5, 2, 2, 4, 3, 4, 2, 4, 4, 5, 3, 2, 4, 4, 3, 5, 4, 5, 3, 5, 5, 4, 2, 3, 2, 4, 2, 5],
    '2.1': [4, 4, 2, 4, 3, 2, 5, 4, 2, 5, 2, 2, 4, 2, 4, 5, 4, 3, 4, 2, 2, 2, 4, 2, 5, 4, 5, 4, 4, 5, 4, 5, 3, 3, 3, 5, 2, 3, 5, 2, 5, 2, 3, 3, 2, 5, 4, 4, 4, 4, 4, 4, 5, 2, 2, 4, 5, 5, 4, 5, 5, 5, 3, 5, 5, 4, 2, 2, 5, 5, 4, 4, 4, 5, 2, 2, 2, 2, 3, 2, 2, 5, 4, 5, 3, 5, 5, 3, 5, 2, 2, 2, 4, 2, 2, 2, 5, 5, 4, 2, 3, 4, 3, 3, 2, 4, 2, 4, 2, 2, 2, 2, 5, 4, 5, 2, 4, 5, 5, 2],
    '2.2': [2, 2, 3, 5, 4, 2, 2, 2, 5, 5, 3, 5, 5, 3, 5, 2, 3, 2, 3, 3, 3, 5, 5, 3, 4, 4, 4, 4, 5, 4, 4, 4, 5, 3, 2, 2, 5, 4, 4, 4, 3, 4, 5, 2, 4, 5, 2, 2, 2, 5, 4, 2, 4, 5, 3, 4, 5, 5, 2, 3, 2, 2, 4, 3, 5, 4, 4, 2, 5, 4, 5, 4, 5, 5, 5, 2, 2, 5, 5, 2, 4, 2, 5, 2, 2, 5, 3, 3, 4, 5, 2, 5, 4, 5, 2, 5, 4, 3, 3, 5, 4, 2, 4, 3, 2, 2, 2, 5, 3, 2, 3, 2, 4, 4, 5, 2, 3, 2, 2, 2],
    '2.3': [5, 3, 5, 4, 3, 4, 3, 3, 4, 4, 4, 4, 4, 3, 2, 4, 2, 3, 5, 2, 5, 3, 5, 4, 5, 4, 4, 4, 4, 2, 3, 3, 5, 3, 5, 5, 5, 3, 5, 2, 5, 4, 5, 4, 5, 4, 3, 4, 5, 3, 3, 2, 4, 3, 5, 2, 4, 5, 5, 3, 2, 4, 5, 3, 2, 5, 4, 5, 2, 3, 5, 3, 5, 3, 3, 2, 2, 5, 2, 4, 4, 3, 3, 5, 5, 5, 5, 5, 2, 5, 5, 3, 3, 4, 2, 5, 2, 4, 5, 5, 2, 2, 2, 4, 5, 5, 5, 4, 5, 5, 2, 5, 5, 3, 2, 2, 4, 4, 2, 5],
    '3.1': [5, 2, 2, 2, 3, 4, 5, 3, 5, 4, 5, 2, 4, 4, 4, 5, 5, 3, 4, 5, 2, 3, 4, 5, 3, 4, 2, 3, 3, 5, 2, 4, 2, 2, 2, 2, 5, 3, 4, 3, 5, 5, 3, 3, 5, 5, 3, 5, 2, 3, 5, 5, 5, 2, 4, 3, 3, 3, 5, 3, 2, 3, 3, 4, 4, 2, 5, 5, 5, 5, 2, 4, 4, 4, 5, 4, 5, 2, 4, 4, 4, 4, 3, 4, 2, 4, 5, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 4, 5, 3, 5, 2, 5, 5, 4, 4, 4, 3, 4, 3, 5, 5, 5, 2, 5, 5, 4, 5, 4, 2],
    '3.2': [5, 2, 2, 3, 3, 5, 5, 2, 5, 2, 4, 4, 3, 4, 3, 4, 3, 5, 4, 4, 2, 4, 2, 5, 2, 3, 4, 5, 3, 3, 2, 5, 3, 2, 3, 3, 5, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 3, 3, 4, 4, 5, 3, 4, 2, 2, 4, 3, 2, 2, 3, 4, 2, 3, 2, 2, 2, 2, 4, 4, 4, 3, 3, 5, 2, 3, 5, 4, 3, 3, 5, 5, 2, 2, 5, 4, 5, 4, 2, 3, 3, 2, 5, 2, 5, 3, 2, 5, 3, 5, 2, 2, 4, 4, 2, 4, 5, 2, 4, 3, 3, 2, 5, 4, 2, 5, 5, 4, 5, 3],
    '3.3': [4, 3, 4, 2, 5, 2, 3, 4, 5, 3, 5, 5, 3, 5, 5, 2, 5, 4, 5, 4, 5, 4, 5, 3, 2, 4, 2, 2, 3, 3, 3, 3, 4, 5, 4, 5, 5, 2, 5, 2, 2, 5, 5, 3, 3, 5, 2, 4, 4, 3, 3, 3, 3, 2, 5, 4, 4, 2, 3, 4, 3, 3, 4, 3, 3, 4, 4, 2, 5, 3, 2, 4, 2, 4, 5, 3, 3, 2, 3, 3, 2, 5, 5, 4, 5, 5, 2, 5, 4, 5, 3, 5, 5, 3, 3, 2, 2, 4, 4, 3, 4, 2, 2, 4, 3, 2, 2, 5, 3, 5, 5, 5, 5, 3, 2, 2, 5, 5, 3, 3],
    '4.1': [5, 4, 5, 2, 3, 4, 5, 2, 2, 5, 3, 2, 2, 3, 5, 5, 4, 3, 4, 2, 2, 3, 5, 5, 3, 2, 4, 4, 3, 3, 2, 4, 3, 5, 4, 2, 4, 5, 3, 5, 4, 5, 3, 4, 3, 3, 3, 3, 2, 5, 2, 4, 4, 4, 3, 5, 2, 4, 2, 5, 4, 5, 3, 4, 5, 2, 4, 5, 4, 5, 4, 2, 3, 2, 4, 2, 5, 4, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 2, 4, 5, 2, 2, 5, 3, 3, 5, 2, 4, 2, 4, 5, 5, 2, 5, 2, 5, 5, 3, 5, 4, 3, 3, 2, 5, 5, 2, 2, 4, 2],
    '4.2': [4, 3, 5, 3, 5, 4, 2, 3, 2, 5, 3, 3, 2, 3, 4, 4, 3, 5, 3, 2, 5, 2, 2, 2, 4, 3, 5, 2, 4, 4, 2, 4, 4, 4, 2, 4, 4, 2, 2, 3, 5, 3, 4, 2, 4, 2, 3, 2, 2, 3, 4, 5, 2, 3, 3, 5, 4, 4, 5, 2, 3, 3, 4, 5, 3, 3, 5, 3, 2, 3, 4, 2, 5, 4, 5, 2, 4, 5, 5, 5, 4, 4, 5, 5, 5, 5, 4, 5, 5, 2, 5, 3, 5, 4, 3, 5, 4, 2, 5, 4, 5, 4, 4, 2, 2, 4, 4, 5, 4, 5, 3, 3, 3, 5, 4, 2, 3, 3, 4, 5],
    '4.3': [4, 3, 3, 3, 5, 5, 3, 3, 5, 3, 5, 3, 4, 3, 3, 3, 5, 2, 5, 2, 2, 2, 3, 2, 5, 2, 3, 5, 4, 5, 2, 4, 2, 4, 2, 5, 3, 2, 3, 4, 4, 3, 3, 3, 5, 2, 5, 3, 2, 4, 2, 4, 2, 4, 3, 4, 5, 5, 5, 2, 4, 4, 4, 4, 3, 4, 5, 2, 2, 3, 3, 4, 5, 5, 5, 3, 2, 3, 5, 4, 2, 3, 5, 5, 5, 2, 2, 3, 4, 5, 4, 3, 5, 3, 5, 2, 4, 4, 5, 3, 3, 4, 5, 4, 2, 4, 3, 2, 2, 2, 5, 2, 5, 2, 3, 2, 2, 4, 4, 2],
}

# Konversi ke DataFrame
df = pd.DataFrame(data)

# Menentukan rentang untuk peta Wright
min_ability = df[['1.1', '1.2', '1.3', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3']].min().min()
max_ability = df[['1.1', '1.2', '1.3', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3']].max().max()

min_difficulty = 1
max_difficulty = 5

# Plot Wright Map
plt.figure(figsize=(12, 8))

# Plotting Student Abilities
for index, row in df.iterrows():
    plt.plot([row['1.1'], row['1.2'], row['1.3'], row['2.1'], row['2.2'], row['2.3'], row['3.1'], row['3.2'], row['3.3']],
             [index]*9, 'o', color='blue', markersize=5, alpha=0.6)

# Plotting Item Difficulties
items = ['1.1', '1.2', '1.3', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3']
for i, item in enumerate(items):
    plt.hlines(i+1, min_difficulty, max_difficulty, colors='red', linestyles='--', label=f'{item} Difficulty')

plt.xlabel('Level of Ability/Difficulty')
plt.ylabel('Student Index / Item Difficulty')
plt.title('Wright Map')
plt.legend(loc='upper right')
plt.grid(True)
plt.show()