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.
Wykres scatter, a przezroczystość
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
- Postów: 7
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.
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()
- Rejestracja: dni
- Ostatnio: dni
- Postów: 50
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.
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
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.
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
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
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:
edgecolor='black', linewidth=1
- Rejestracja: dni
- Ostatnio: dni
DarekRepos napisał(a):
A czy da sie napisac kod albo dac jakiegos obraza nawet jesli on nie jest dzialajacy, bo tu rózne formaty
rgbaczyhexto inaczej sie ustawia przezroczystoscPodsumowując różne format jest rożnie obsługiwany przez
matplotlib, ale ten efekt mozna uzyskac za pomoca hex lub rgba z wykorzystaniem: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:
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.
- Rejestracja: dni
- Ostatnio: dni
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.
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:
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.
- Rejestracja: dni
- Ostatnio: dni
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:
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 50
Ja się trochę pobawiłem i mi cos takiego wyszło:
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()

- Rejestracja: dni
- Ostatnio: dni
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.