Как получить значения пикселя изображения изображения без сохранения сюжета? [Дубликат]

Функция base reshape работает отлично:

df <- data.frame(
  year   = c(rep(2000, 12), rep(2001, 12)),
  month  = rep(1:12, 2),
  values = rnorm(24)
)
df_wide <- reshape(df, idvar="year", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Здесь idvar - столбец классов, который разделяет строки, timevar - столбец классов, который должен быть широко представлен, v.names - это столбец, содержащий числовые значения, direction указывает широкий или длинный формат, а необязательный аргумент sep - это разделитель, используемый между именами классов timevar и v.names на выходе data.frame. Если нет idvar, создайте его перед использованием функции reshape():

df$id   <- c(rep("year1", 12), rep("year2", 12))
df_wide <- reshape(df, idvar="id", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Просто помните, что требуется idvar! Часть timevar и v.names проста. Выход этой функции более предсказуем, чем некоторые другие, поскольку все явно определено.

23
задан user1003146 19 October 2011 в 13:44
поделиться

1 ответ

Это удобный трюк для модульных тестов и т. п., когда вам нужно выполнить сравнение пикселей с пикселями с сохраненным графиком.

Один из способов - использовать fig.canvas.tostring_rgb, а затем numpy.fromstring с approriate dtype. Есть и другие способы, но это тот, который я обычно использую.

Например,

import matplotlib.pyplot as plt
import numpy as np

# Make a random plot...
fig = plt.figure()
fig.add_subplot(111)

# If we haven't already shown or saved the plot, then we need to
# draw the figure first...
fig.canvas.draw()

# Now we can save it to a numpy array.
data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
40
ответ дан Joe Kington 23 August 2018 в 00:03
поделиться
  • 1
    Отлично! 12345 – Petter 19 October 2011 в 16:39
  • 2
    Поддерживается ли это только на некоторых бэкэнд? Кажется, что не работает с macosx backend (tostring_rgb) не найден. – mirosval 5 March 2014 в 17:07
  • 3
    Работает над Agg, добавляет matplotlib.use('agg') перед import matplotlib.pyplot as plt, чтобы использовать его. – mirosval 5 March 2014 в 17:38
  • 4
    С изображениями холст добавляет большой запас, поэтому мне было полезно вставить fig.tight_layout(pad=0) перед рисованием. – Dan Allan 14 October 2014 в 17:01
  • 5
    Для фигур с линиями и текстом также может быть важно отключить сглаживание. Для строк plt.setp([ax.get_xticklines() + ax.get_yticklines() + ax.get_xgridlines() + ax.get_ygridlines()],antialiased=False) и для текста mpl.rcParams['text.antialiased']=False – kmader 3 November 2016 в 12:13
  • 6
    – xg.plt.py 8 June 2018 в 16:32
Другие вопросы по тегам:

Похожие вопросы: