Обработка статистики в Gadfly - PullRequest
2 голосов
/ 05 апреля 2020

Я хочу расширить пакет Gadfly, чтобы он соответствовал моим собственным особенностям c. Однако у меня возникают проблемы с пониманием того, как использовать статистику Gadfly таким образом, чтобы можно было обрабатывать их вывод перед построением графика.

Например, скажем, я хочу использовать эстетику x, y, созданную Stat.histogram. Чтобы добавить их в сюжет, я понимаю, что могу включить Stat.histogram в качестве аргумента в layer(). Но что мне делать, если я хочу использовать Stat.histogram для вычисления эстетики x, y, редактировать их, используя мой собственный код, а затем отображать эти отредактированные эстетики?

Я ищу такую ​​функцию, как load_aesthetics(layer(x=x, Stat.histogram)), или поле типа layer(x=x, Stat.histogram).aesthetics.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Основываясь на ответе @ bjarthur, я написал следующую функцию.

"Return the aesthetics produced by a Gadfly Statistic object."
function process_statistic(statistic::Gadfly.StatisticElement,
                           input_aesthetics::Dict{Symbol,<:Any}
                           )

    # Check that enough statistics have been provided.
    required_aesthetics = Gadfly.input_aesthetics(statistic)
    for required_aesthetic in required_aesthetics
        if required_aesthetic ∉ keys(input_aesthetics) 
            error("Aesthetic $(required_aesthetic) is required")
        end
    end

    # Create the aes object, which contains the statistics.
    aes = Gadfly.Aesthetics()
    [setfield!(aes, key, value) for (key, value) in input_aesthetics]

    # These need to be passed to the apply_statistic() function. I do
    # not understand them, and the below code might need to be edited
    # for this function to work in some cases.
    scales = Dict{Symbol, Gadfly.ScaleElement}()
    coord  = Gadfly.Coord.Cartesian()

    # This function edits the aes object, filling it with the desired aesthetics.
    Gadfly.Stat.apply_statistic(statistic, scales, coord, aes)

    # Return the produced aesthetics in a dictionary.
    outputs = Gadfly.output_aesthetics(statistic)
    return Dict(output => getfield(aes, output) for output in outputs)

end

Пример использования:

process_statistic(Stat.histogram(), Dict(:x => rand(100)))
1 голос
/ 06 апреля 2020

вы можете создать свою собственную статистику c. см https://github.com/GiovineItalia/Gadfly.jl/issues/894

...