Ответ на пост «Минусы»43
Пикабу, есть вот какая идея, она кажется очень наглядной и интуитивно понятной, вместо отображения полосочек с минусами. @pikabu, @moderator, как вам идея?
Можно создать интересометр – инструмент, который поможет анализировать реакцию на контент. Он работает аналогично полярной системе координат (см. рисунок 1) и выглядит как циферблат.
В основе лежит 2D круговая диаграмма:
Вертикальная ось (OY) отвечает за баланс положительных и отрицательных реакций.
Горизонтальная ось (OX) отражает уровень интереса, связанный с числом реакций.
В результате получаем точку на окружности в одной из областей.
В исходном состоянии (без реакций) стрелка (точка) указывает направо (3 часа). Далее:
Если много плюсов, она поднимается вверх (к 12 часам).
Если много минусов, опускается вниз (к 6 часам).
Если плюсы и минусы примерно равны, но их много, стрелка указывает налево (9 часов).
Если плюсы и минусы равны, но их мало, остается направленной на 3 часа (слабый интерес).
(см. рисунок 2)
Дополнительно можно использовать цветовую кодировку:
Зеленый оттенок – преобладание плюсов.
Красный оттенок – преобладание минусов.
Серый оттенок– слабый интерес.
Оранжевый – сильный интерес при сумме реакций, близкой к нулю.
При этом, так же как и сейчас выводим модуль числового значения разницы между плюсами и минусами для всех постов.
В таком формате система будет интуитивно понятной. Смотри примеры на рисунке 3.
Реализовать можно примерно так:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
Np = np.random.randint(0, 200, 30) #плюсы
Nm = np.random.randint(-200, 0, 30) #минусы
# Устанавливаем число реакций на пост, после которого отражаем X
threshold = 150
Nm_abs = np.abs(Nm)
theta = (np.pi / 2) * (Np - Nm_abs) / (Np + Nm_abs + 1e-9)
X = np.cos(theta)
Y = np.sin(theta)
# Отражаем X, если Np < |Nm|
X = np.where(Np + Nm_abs > threshold, -X, X)
colors = []
for i in range(len(X)):
if np.abs(X[i]) < np.sin(np.pi/4) and Y[i] > 0: # X ≈ 0 и Y ≈ 1
colors.append("green")
elif np.abs(X[i]) < np.sin(np.pi/4) and Y[i] < 0: # X ≈ 0 и Y ≈ -1
colors.append("red")
elif np.abs(Y[i]) < np.sin(np.pi/4) and X[i] > 0: # Y ≈ 0 и X ≈ 1
colors.append("gray")
elif np.abs(Y[i]) < np.sin(np.pi/4) and X[i] < 0: # Y ≈ 0 и X ≈ -1
colors.append("orange")
else:
colors.append("black")
fig, ax = plt.subplots(figsize=(6, 6))
circle = plt.Circle((0, 0), 1, color='black', fill=False, linewidth=2)
ax.add_patch(circle)
# Размещаем точки
ax.scatter(X, Y, c=colors, label="Точки на окружности")
# Настройки осей
ax.set_xlim(-1.2, 1.2)
ax.set_ylim(-1.2, 1.2)
ax.axhline(0, color='gray', linestyle='--', linewidth=0.5)
ax.axvline(0, color='gray', linestyle='--', linewidth=0.5)
ax.set_aspect('equal', adjustable='datalim')
plt.grid(True)
# Легенда цветов
from matplotlib.patches import Patch
legend_elements = [
Patch(facecolor='green', label='X ≈ 0, Y ≈ 1'),
Patch(facecolor='red', label='X ≈ 0, Y ≈ -1'),
Patch(facecolor='gray', label='X ≈ 1, Y ≈ 0'),
Patch(facecolor='orange', label='X ≈ -1, Y ≈ 0')
]
ax.legend(handles=legend_elements)
plt.show()
print("Np (положительные):", Np)
print("Nm (отрицательные):", Nm)
print("X:", X)
print("Y:", Y)
В целом, рассуждая дальше, систему можно еще упростить. Вместо стрелки можно использовать одну точку, размещенную в соответствующей области на окружности. А можно вообще использовать рамку всего виджета с оценкой поста. Просто внедрить соответствующую точку в нужном месте на периметре.
Что скажете?





Отзывы и предложения по Пикабу
16.2K поста2.7K подписчиков
Правила сообщества
Сообщество для аккумуляции всего фидбека по Пикабу
Если вы предлагаете новую функцию, опишите подробно:
- Задачу, которую выполняет предлагаемое изменение;
- Возможные плюсы и минусы;
- Версию Пикабу, для которой делаете предложение.
Пожалуйста, имейте в виду, что предложение:
- Должно быть полезным, понятным и простым;
- Должно быть востребованным пикабушниками;
- Не должно создавать визуального нагромождения.