2016-11-04 8 views
2

Я рисую коллекцию прямоугольников с matplotlib.patches. Мой код:Как я могу получить пиксельные цвета в matplotlib?

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

fig = plt.figure(figsize=(14, 10)) 

for i in rectangles_list: 

    ax1 = fig.add_subplot(111, aspect='equal') 
    ax1.add_patch(patches.Rectangle(
       (x[i], y[i]), 
        width[i], 
        height[i], 
        alpha = 1.0, 
        facecolor = colors_list[i] 
       ) 
       ) 

plt.show() 

Прямоугольники могут быть перекрывающимися, поэтому некоторые из них могут быть полностью скрыты. Знаете ли вы, можно ли получить цвета видимых прямоугольников? Я имею в виду цвета прямоугольников, которые не полностью скрыты и, следовательно, могут быть фактически просмотрены пользователем. Я думал о некоторой функции, которая возвращает цвет пикселей, но более разумные идеи приветствуются. Если возможно, я бы предпочел не использовать PIL. К сожалению, я не могу найти какое-либо решение в Интернете.

+1

Я надеваю Не думаю, что есть встроенные методы для этого с помощью matplotlib. Однако вы можете найти [стройный] (https://pypi.python.org/pypi/Shapely) полезный. (См. [Union] (http://toblerity.org/shapely/manual.html#object.union) и [содержит] (http://toblerity.org/shapely/manual.html#object.contains).) – unutbu

+0

Не удалось запустить ваш код, пропуская 'rectangles_list'. Как насчет уменьшения значения альфа, чтобы вы могли видеть что-либо за верхним прямоугольником. – hashmuke

+0

Я думаю, что должно быть возможно обернуть 'fig.canvas.tostring_argb()' в массив ARGB через 'numpy', чтобы получить все цвета на экране. Не уверен, что теперь приступить, но может быть началом. –

ответ

2

После Влас Соколов комментарий, и этот Stackoverflow post Джо Кингтон, вот как вы могли бы получить Numpy массив, содержащий все уникальные цвета, которые видны на Matplotlib рисунке:

import matplotlib.pyplot as plt 
from matplotlib.patches import Rectangle 
import numpy as np 

plt.close('all') 

# Generate some data : 

N = 1000 
x, y = np.random.rand(N), np.random.rand(N) 
w, h = np.random.rand(N)/10 + 0.05, np.random.rand(N)/10 + 0.05 
colors = np.vstack([np.random.random_integers(0, 255, N), 
        np.random.random_integers(0, 255, N), 
        np.random.random_integers(0, 255, N)]).T 

# Plot and draw the data : 

fig = plt.figure(figsize=(7, 7), facecolor='white') 
ax = fig.add_subplot(111, aspect='equal') 
for i in range(N): 
    ax.add_patch(Rectangle((x[i], y[i]), w[i], h[i], fc=colors[i]/255., ec='none')) 
ax.axis([0, 1, 0, 1]) 
ax.axis('off') 
fig.canvas.draw() 

# Save data in a rgb string and convert to numpy array : 

rgb_data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') 
rgb_data = rgb_data.reshape((int(len(rgb_data)/3), 3)) 

# Keep only unique colors : 

rgb_data = np.vstack({tuple(row) for row in rgb_data}) 

# Show and save figure : 

fig.savefig('rectangle_colors.png') 
plt.show() 

enter image description here

+0

Ничего себе, это красиво! Следуя предложению unutbu, я сделал это геометрически, но проверю ваш код и позже, и я обязательно его использую, так как он выглядит намного более изящным и простым, чем мой! – user2983638

+0

Хорошо, я подтверждаю, что он отлично работает, огромное спасибо! – user2983638

+0

@ user2983638 Вы очень желанны, я рад, что это сработало. –