Wykres scatter, a przezroczystość

Wykres scatter, a przezroczystość
DR
  • Rejestracja: dni
  • Ostatnio: dni
0

Czy istnieje jakaś funkcja scatter plot wyłączając tą z modułu matplotlib, która pozwalała by ustawiać kolor na przezroczysty. Z funkcją z modułu matplotlib jest ten problem, że można ustawić przezroczystość dla całego markera, a ja potrzebuje aby kolor tzn. wnętrze markera było przezroczyste, a krawędź w moim przypadku czarna żeby zachowała pełną barwę. W funkcji z matplotlib nie da się tego zrobić. Sprawdziłem wszystkie możliwości, przejrzałem dokumentacje i można tylko ustawiać przezroczystość całego markera parametrem alpha, a jak określam kolor (w dowolnym formacie rgb, hex ) dodając parametr odpowiedzialny za przezroczystość (alpha) to funkcja go pomija.

RS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
dretred napisał(a):

Czy istnieje jakaś funkcja scatter plot wyłączając tą z modułu matplotlib, która pozwalała by ustawiać kolor na przezroczysty. Z funkcją z modułu matplotlib jest ten problem, że można ustawić przezroczystość dla całego markera, a ja potrzebuje aby kolor tzn. wnętrze markera było przezroczyste, a krawędź w moim przypadku czarna żeby zachowała pełną barwę. W funkcji z matplotlib nie da się tego zrobić. Sprawdziłem wszystkie możliwości, przejrzałem dokumentacje i można tylko ustawiać przezroczystość całego markera parametrem alpha, a jak określam kolor (w dowolnym formacie rgb, hex ) dodając parametr odpowiedzialny za przezroczystość (alpha) to funkcja go pomija.

Kopiuj
import matplotlib.pyplot as plt
from matplotlib.patches import PathPatch
from matplotlib.path import Path

circle_path = Path.unit_circle()


patch = PathPatch(circle_path, facecolor=(0, 0, 0, 0), edgecolor='black', lw=2, transform=plt.gca().transData)


fig, ax = plt.subplots()
ax.add_patch(patch)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
plt.show()
DarekRepos
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 50
0

A czy da sie napisac kod albo dac jakiegos obraza nawet jesli on nie jest dzialajacy, bo tu rózne formaty rgba czy hex to inaczej sie ustawia przezroczystość

Z tego co pisze co udalo mi sie znalezc musimy np

1.. RGBA: Każdy punkt jest reprezentowany przez wartość RGBA, gdzie ostatnia wartość (alpha) określa poziom przezroczystości.

Kopiuj
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(100)
y = np.random.rand(100)

plt.scatter(x[:20], y[:20], color=(1, 0, 0, 0.5), label='Czerwone, 50% przezroczystości')  # Czerwone, półprzezroczyste
plt.scatter(x[20:40], y[20:40], color=(0, 1, 0, 0.8), label='Zielone, 80% przezroczystości')  # Zielone, bardziej nieprzezroczyste
plt.scatter(x[40:], y[40:], color=(0, 0, 1, 0.2), label='Niebieskie, 20% przezroczystości')  # Niebieskie, bardzo przezroczyste

plt.legend()
plt.show()

2.. Nazwa koloru + alpha: Tutaj używamy popularnych nazw kolorów i ustawiamy poziom przezroczystości za pomocą parametru alpha. Tu jest to o czym piszesz ze caly punkt jest przezroczysty

Kopiuj
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(100)
y = np.random.rand(100)

plt.scatter(x[:20], y[:20], color='red', alpha=0.5, label='Czerwone, 50% przezroczystości')
plt.scatter(x[20:40], y[20:40], color='green', alpha=0.8, label='Zielone, 80% przezroczystości')
plt.scatter(x[40:], y[40:], color='blue', alpha=0.2, label='Niebieskie, 20% przezroczystości')

plt.legend()
plt.show()

3.. Hex code + alpha: do określenia kolorów i dodajemy dwie dodatkowe cyfry heksadecymalne na końcu, aby określić wartość alpha.

Kopiuj
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(100)
y = np.random.rand(100)

plt.scatter(x[:20], y[:20], color='#FF000080', label='Czerwone, 50% przezroczystości')  # Czerwony hex code z 50% przezroczystości
plt.scatter(x[20:40], y[20:40], color='#00FF00CC', label='Zielone, 80% przezroczystości')  # Zielony hex code z 80% przezroczystości
plt.scatter(x[40:], y[40:], color='#0000FF33', label='Niebieski hex code z 20% przezroczystości')  # Niebieski hex code z 20% przezroczystości

plt.legend()
plt.show()

Nizej przedstawie po przyklady ustawienia przezroczyscosci np

1.. z wykorzystaniem formatu rgba

Kopiuj
import matplotlib.pyplot as plt
import numpy as np

# Dane
x = np.random.rand(100)
y = np.random.rand(100)

# Kolory i przezroczystości dla różnych grup
colors = [(1, 0, 0, 0.5), (0, 1, 0, 0.8), (0, 0, 1, 0.2), (0, 0, 1, 0.02)]
markers = ['o', 's', 'D', 'X']

# Tworzenie wykresu
for i in range(4):
    plt.scatter(x[i*20:(i+1)*20], y[i*20:(i+1)*20], color=colors[i], marker=markers[i], label=f'Grupa {i+1}', edgecolor='black', linewidth=1)

plt.legend()
plt.show()

2.. z wykorzystaniem formatu hex

Kopiuj
import matplotlib.pyplot as plt
import numpy as np

# Przygotowanie danych
x = np.random.rand(100)
y = np.random.rand(100)

# Kolory hex dla różnych grup
colors = ['#FF000000', '#00FF0080', '#0000FFCC', '#80808033']  # Czerwony, zielony, niebieski, szary
markers = ['o', 's', 'D', 'X']

# Tworzenie wykresu
for i in range(4):
    plt.scatter(x[i*20:(i+1)*20], y[i*20:(i+1)*20], color=colors[i], marker=markers[i], label=f'Grupa {i+1}', edgecolor='black', linewidth=1)

plt.legend()
plt.show()

3.. z wykorzystaniem nazwy koloru plus opcja alpha ( tutaj caly punkt jest poddany przezroczystosci.

Podsumowując różne format jest rożnie obsługiwany przez matplotlib, ale ten efekt mozna uzyskac za pomoca hex lub rgba z wykorzystaniem:

Kopiuj
edgecolor='black', linewidth=1
DR
  • Rejestracja: dni
  • Ostatnio: dni
0
DarekRepos napisał(a):

A czy da sie napisac kod albo dac jakiegos obraza nawet jesli on nie jest dzialajacy, bo tu rózne formaty rgba czy hex to inaczej sie ustawia przezroczystosc

Podsumowując różne format jest rożnie obsługiwany przez matplotlib, ale ten efekt mozna uzyskac za pomoca hex lub rgba z wykorzystaniem:

Kopiuj
edgecolor='black', linewidth=1

Wszystko co napisałeś już wypróbowałem wcześniej. Problem w tym, że podając kolor np. w hex już z dodanym parametrem odpowiedzialnym za alpha funkcja obcina ostatnie dwie wartości tzn. wyświetla kolor bez przezroczystości. Paleta rgba też nie działa. Chyba wypróbowałem wszystkie możliwości. Zamieszczam wycinek kodu tak na wszelki wypadek ale obawiam się, że tym sposobem się nic nie zdziała:

Kopiuj
plt.scatter(X_test[:, 0], X_test[:, 1], c = 'lightgreen', alpha = 0.2, linewidths = 1.0, marker = 'o', edgecolors = 'k',
                   s = 80, label = 'Zestaw testowy')

Tutaj jest wartość przypisana na 'sztywno' ale przekazuje też wartości kolorów za pomocą krotki i to też nic nie zmienia. Przeanalizuje jeszcze jutro to co napisał RuneSpecter bo dzisiaj dopiero do tego usiadłem i spróbuje to wkomponowac w mój kod i zobaczymy. W każdym razie dzięki za poświęcony czas.

DR
  • Rejestracja: dni
  • Ostatnio: dni
0
RuneSpecter napisał(a):
dretred napisał(a):

Czy istnieje jakaś funkcja scatter plot wyłączając tą z modułu matplotlib, która pozwalała by ustawiać kolor na przezroczysty. Z funkcją z modułu matplotlib jest ten problem, że można ustawić przezroczystość dla całego markera, a ja potrzebuje aby kolor tzn. wnętrze markera było przezroczyste, a krawędź w moim przypadku czarna żeby zachowała pełną barwę. W funkcji z matplotlib nie da się tego zrobić. Sprawdziłem wszystkie możliwości, przejrzałem dokumentacje i można tylko ustawiać przezroczystość całego markera parametrem alpha, a jak określam kolor (w dowolnym formacie rgb, hex ) dodając parametr odpowiedzialny za przezroczystość (alpha) to funkcja go pomija.

Kopiuj
import matplotlib.pyplot as plt
from matplotlib.patches import PathPatch
from matplotlib.path import Path

circle_path = Path.unit_circle()


patch = PathPatch(circle_path, facecolor=(0, 0, 0, 0), edgecolor='black', lw=2, transform=plt.gca().transData)


fig, ax = plt.subplots()
ax.add_patch(patch)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
plt.show()

No dobrze, tak trochę zacząłem patrzeć na to i gdzie tu na przykład podłączyć jakieś dane? Może masz kawałek kodu działającego chociaż z jednym punktem na wykresie? Znalazłem gdzieś info na temat metody PathPatch i podaje dane zgodnie z zamieszczoną tam instrukcją i pokazuje się błąd. Dane podaje w formie listy par wartości w miejsce circle_path tzn. robię tak:

Kopiuj
dane = list(zip(X_test[:, 0], X_test[:, 1]))
patch = PathPatch(dane, facecolor(0, 0, 0, 0), edgecolor = 'black', lw = 2, transform = plt.gca().transData)

fig, ax = plt.subplots()
ax.add_patch(patch)

No i tu się pojawia błąd ale w ogóle nie wiem czy dane dobrze mu podaje. Robię to na podstawie przykładu ze stackoverflow. W razie czego mogę przesłać jaki błąd mi wyrzuca ale muszę wiedzieć czy dobrze dane podaje.
Aha i w takiej sytuacji wykluczona jest zmienna circle_path.

DR
  • Rejestracja: dni
  • Ostatnio: dni
0
dretred napisał(a):
RuneSpecter napisał(a):
dretred napisał(a):

Aha i w takiej sytuacji wykluczona jest zmienna circle_path.

Funkcja circle_path nie przyjmuje danych ani z listy, ani z krotki. Próbowałem funkcję circle() i ona przyjmuje współrzędne punktu w krotce ale tylko jedną współrzędną. Dla większej liczby wyrzuca błąd.

No i wydaje mi się, że z tym kodem jest chyba coś nie tak:

Kopiuj
fig, ax = plt.subplots()
ax.add_patch(patch)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
plt.show()

???
No i w ogóle ten kod jakiś zamotany trochę jest. Jakbyś go trochę objaśnił byłoby fajnie.

DarekRepos
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 50
0

Ja się trochę pobawiłem i mi cos takiego wyszło:

Kopiuj
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import numpy as np

# Additional points to plot
darkpoints = np.array([[0.5, 0.5], [0.8, -0.2], [0.3, -0.1]])
lightpoints = np.array([[0.12, 0.4], [0.6, -0.3], [0.4, -0.2]])

# Define Bézier curve control points
verts = [
    (0.0, 0.0),  # Start point
    (0.25, 1.0),
    (0.75, 1.0),
    (1.0, 0.0),  # Control points for the first curve
    (1.0, 0.0),  # End point of the first curve and start point of the second
    (0.75, -1.0),
    (0.25, -1.0),
    (0.0, 0.0),  # Control points for the second curve
]

# Define the codes for the path (1 for line segments, 3 for cubic Bézier curves)
codes = [
    Path.MOVETO,
    Path.CURVE4,
    Path.CURVE4,
    Path.CURVE4,
    Path.MOVETO,
    Path.CURVE4,
    Path.CURVE4,
    Path.CURVE4,
]

# Create the Path object
path = Path(verts, codes)

# Create the PathPatch
patch = PathPatch(
    path, facecolor="none", edgecolor="black", lw=2, transform=plt.gca().transData
)

# Create the plot
fig, ax = plt.subplots()
ax.add_patch(patch)
ax.scatter(
    darkpoints[:, 0],
    darkpoints[:, 1],
    c=[(6 / 255, 49 / 255, 132 / 255, 1)], # rgba(6, 49, 132, 1) z 100% przezroczystosci - hex #063184
    linewidths=2.0,
    marker="o",
    edgecolors="black",
    s=80,
)
ax.scatter(
    lightpoints[:, 0],
    lightpoints[:, 1],
    c=[(6 / 255, 49 / 255, 132 / 255, 0.5)],  # rgba(6, 49, 132, 0.5) z 50% przezroczystosci - hex #063184
    linewidths=2.0,
    marker="o",
    edgecolors="black",
    s=80,
)

plt.axis("equal")  # Optional: Set equal aspect ratio for the plot
plt.show()

screenshot-20241125120325.png

DR
  • Rejestracja: dni
  • Ostatnio: dni
0
DarekRepos napisał(a):

Ja się trochę pobawiłem i mi cos takiego wyszło:

Dzięki za wysiłek. W wolnej chwili posiedzę i spróbuje to jakoś zmodyfikować i dopasować do mojego kodu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.