Функция 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
проста. Выход этой функции более предсказуем, чем некоторые другие, поскольку все явно определено.
Это удобный трюк для модульных тестов и т. п., когда вам нужно выполнить сравнение пикселей с пикселями с сохраненным графиком.
Один из способов - использовать 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,))
macosx
backend (tostring_rgb
) не найден. – mirosval 5 March 2014 в 17:07matplotlib.use('agg')
передimport matplotlib.pyplot as plt
, чтобы использовать его. – mirosval 5 March 2014 в 17:38fig.tight_layout(pad=0)
перед рисованием. – Dan Allan 14 October 2014 в 17:01plt.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