# descrição das colunas:
# "Galaxy" nome da galáxia
# "DMpc" distância (Mpc)
# "MBH" massa do BN
# "MBHd" massa inferior do BN (68%)
# "MBHu" massa superior do BN (68%)
# "method" observável usado para estimar a massa do BN
# "sigma" dispersão de velocidades das estrelas (km/s)
# "sigmad" valor inferior para sigma (68%)
# "sigmau" valor superior para sigma (68%)
# "logLV" log da luminosidade da galáxia na banda V (em unidades de Lsun)
# "elogLV" erro em logLV
# "Mbulge" massa do bojo da galáxia (em Msun)
# "rinf" "raio de influência" do BN (arcsec) GM_BN/sigma^2
# "morphology" tipo morfológico
# "profile" tipo de perfil central: "core" (C), lei de potência (pl)
# note que os erros em MBH e sigma são assimétricos!
attach(dados)
n = nrow(dados)
# dados em log
# x: log sigma
# y: log MBH
x = log10(sigma)
xd = log10(sigma)-log10(sigmad) # barra de erro em x inferior
xu = log10(sigmau)-log10(sigma) # barra de erro em x superior
y = log10(MBH)
yd = log10(MBH)-log10(MBHd) # barra de erro em y inferior
yu = log10(MBHu)-log10(MBH) # barra de erro em x superior
# função para visualização com barras de erro em x e y
# DeepSeek
#' Scatter Plot with Asymmetrical Error Bars
#'
#' @param x Vector of x values
#' @param y Vector of y values
#' @param x_lower Vector of lower x errors
#' @param x_upper Vector of upper x errors
#' @param y_lower Vector of lower y errors
#' @param y_upper Vector of upper y errors
#' @param xlab X-axis label (default: "X")
#' @param ylab Y-axis label (default: "Y")
#' @param main Plot title (default: "")
#' @param pch Point character (default: 19)
#' @param col Point color (default: "black")
#' @param err_col Error bar color (default: "gray50")
#' @param err_lwd Error bar line width (default: 1)
#' @param err_length Error bar cap length (in inches, default: 0.03)
#' @param ... Additional graphical parameters passed to plot()
#' @return A scatter plot with asymmetrical error bars
#' @examples
#' # Example usage:
#' x <- 1:5
#' y <- c(2, 4, 3, 5, 6)
#' x_lower <- c(0.1, 0.2, 0.1, 0.3, 0.2)
#' x_upper <- c(0.2, 0.3, 0.2, 0.4, 0.3)
#' y_lower <- c(0.3, 0.4, 0.2, 0.5, 0.4)
#' y_upper <- c(0.4, 0.5, 0.3, 0.6, 0.5)
#' plot_with_asym_errors(x, y, x_lower, x_upper, y_lower, y_upper)
plot_with_asym_errors <- function(x, y,
x_lower = NULL, x_upper = NULL,
y_lower = NULL, y_upper = NULL,
xlab = "X", ylab = "Y", main = "",
pch = 19, col = "black",
err_col = "gray50", err_lwd = 1,
err_length = 0.03, ...) {
# Input validation
if (length(x) != length(y)) {
stop("x and y must have the same length")
}
# Set default errors if not provided
if (is.null(x_lower)) x_lower <- rep(0, length(x))
if (is.null(x_upper)) x_upper <- rep(0, length(x))
if (is.null(y_lower)) y_lower <- rep(0, length(x))
if (is.null(y_upper)) y_upper <- rep(0, length(x))
# Check error lengths
if (length(x_lower) != length(x) || length(x_upper) != length(x) ||
length(y_lower) != length(x) || length(y_upper) != length(x)) {
stop("All error vectors must have same length as x and y")
}
# Calculate plot limits
x_range <- range(c(x - x_lower, x + x_upper), na.rm = TRUE)
y_range <- range(c(y - y_lower, y + y_upper), na.rm = TRUE)
# Create base plot
plot(x, y, xlim = x_range, ylim = y_range,
xlab = xlab, ylab = ylab, main = main,
pch = pch, col = col, ...)
# Add error bars
arrows(x0 = x - x_lower, y0 = y,
x1 = x + x_upper, y1 = y,
angle = 90, code = 3, length = err_length,
col = err_col, lwd = err_lwd)
arrows(x0 = x, y0 = y - y_lower,
x1 = x, y1 = y + y_upper,
angle = 90, code = 3, length = err_length,
col = err_col, lwd = err_lwd)
# Return invisibly
invisible(list(x = x, y = y,
x_err = cbind(x_lower, x_upper),
y_err = cbind(y_lower, y_upper)))
}
par(mfrow = c(1,1))
library(latex2exp)
plot_with_asym_errors(x, y, xd, xu, yd, yu,
xlab = expression(paste('log ',sigma,' (km/s)')), ylab = TeX('$log (M_{BH} /M_{sun})$'),
main = " ",
pch = 21, col = "blue", bg = "lightblue",
err_col = "lightblue", err_lwd = 1.2)