Джулия: две оси x для графика одних и тех же данных

#julia #plotly

#джулия #plotly

Вопрос:

Для определенных функций удобно и обычно строить один набор данных с двумя осями x. Мой пример — это функция формы f(T)=A*exp(-H/(R*T)) , которая должна быть нанесена 1/T на ось x и log(f) на ось y. В этой форме он удобно отображается в виде прямой линии, но для удобства считывания фактической температуры T вместо 1/T этого обычно помещают соответствующие T значения на вторую ось x на том же графике (который затем, конечно, переворачивается, а также не линейно разнесен). Как мне добиться этого с помощью Julia и Plotly?

Вот пример типа графика, который я пытаюсь создать. Как бы то ни было, в Gnuplot будет создана дополнительная вторая (верхняя) ось x set link x2 via 1./x inverse 1./x . зависимость проводимости от температуры

Ответ №1:

Для добавления второй оси Y twinx() в пакете есть метод Plots.jl . К сожалению, не существует twiny() метода, который мог бы позволить добавить дополнительную ось X.

Однако вы можете взять twinx() код и просто перенести его:

 function twiny(sp::Plots.Subplot)
    sp[:top_margin] = max(sp[:top_margin], 30Plots.px)
    plot!(sp.plt, inset = (sp[:subplot_index], bbox(0,0,1,1)))
    twinsp = sp.plt.subplots[end]
    twinsp[:xaxis][:mirror] = true
    twinsp[:background_color_inside] = RGBA{Float64}(0,0,0,0)
    Plots.link_axes!(sp[:yaxis], twinsp[:yaxis])
    twinsp
end
twiny(plt::Plots.Plot = current()) = twiny(plt[1])
  

И теперь используйте это так:

 using Plots
plot(1:10,rand(10), label = "randData", ylabel = "Y axis",color = :red, legend = :topleft, grid = :off, xlabel = "Numbers Rand")
p = twiny()
plot!(p,5:15,log.(5:15), label = "log(x)", legend = :topright, box = :on, grid = :off, xlabel = "Log values")
  

введите описание изображения здесь

Комментарии:

1. Спасибо за предложение, но я думаю, что это не совсем то, что я имел в виду, и мне не удалось изменить его таким образом, чтобы удовлетворить мои потребности. Я отредактировал свой исходный пост и добавил пример рисунка для пояснения. Цель состоит не в том, чтобы добавить вторую кривую с другой осью x, а в том, чтобы показать кривую с двумя осями x в разных единицах измерения / масштабирования (в данном случае обратная температура и температура). Обратите внимание, что это также включает в себя изменение второй оси x.

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

3. Да, возможно, стоит сделать пиар. Что касается того, что вам нужно сделать (обновлено), это должно быть легко — в графиках есть функции для добавления пользовательских тиков — когда у меня будет идея, как это сделать, я сделаю сообщение 😉