R versus Python
Comparación de lenguajes
A continuación se presentan algunos ejemplos de código equivalente en R y Python para facilitar la comparación entre ambos lenguajes. No se trata de una comparación exhaustiva y cualquier operación adicional que pueda ser necesaria en uno u otro lenguaje se cubrirá en su aplicación econométrica coorespondiente.
Code
# Ayuda
#
# Información sobre un comando: print
# ?print
# help(print)
#
# Matrices de datos (data arrays)
#
# Crear un vector:
my_vec <- c(1, 2, 3, 4, 5, 6, 7, 8)
str(my_vec) num [1:8] 1 2 3 4 5 6 7 8
Code
# Seleccionar los datos de un vector (en R los valores comienzan en el índice 1)
print(my_vec[1])[1] 1
Code
# Rango de valores: en R el índice rango es 1:3 = {1, 2, 3}
print(my_vec[1:3])[1] 1 2 3
Code
print(my_vec[c(1, 2, 4, 8)])[1] 1 2 4 8
Code
my_range <- seq(from = 1, to = 4, by = 1)
print(my_range)[1] 1 2 3 4
Code
print(my_range[1:4])[1] 1 2 3 4
Code
# Longitud de la matriz de datos
print(length(my_vec))[1] 8
Code
# Bucles (loops)
for(i in 1:length(my_vec)){
print(my_vec[i])}[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
Code
# Seleccionar cada tercer elemento, empezando desde el segundo
print(my_vec[seq(2, length(my_vec), 3)])[1] 2 5 8
Code
# o cada segundo elemento partiendo desde el primero
print(my_vec[seq(1, length(my_vec), 2)])[1] 1 3 5 7
Code
# Suma de vectores
my_vec_1 = seq(from = 1, to = 5, by = 1)
my_vec_2 = rev(my_vec_1)
cat("vec. 1: ", my_vec_1)vec. 1: 1 2 3 4 5
Code
cat("vec. 2: ", my_vec_2)vec. 2: 5 4 3 2 1
Code
vec_sum = my_vec_1 + my_vec_2
cat("vec. 1 + 2: ", vec_sum)vec. 1 + 2: 6 6 6 6 6
Code
# Concatenación de vectores
cat("vec. 1 & 2: ", c(my_vec_1, my_vec_2))vec. 1 & 2: 1 2 3 4 5 5 4 3 2 1
Code
# Multiplicar los elementos de un vector por una constante
cat(my_vec_1 * 3)3 6 9 12 15
Code
# Concatenar un vector varias veces
cat(rep(my_vec_1, 3))1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
Code
# Cadenas de caracteres
#
# Funciones específicas de R para modificar caracteres
my_animal = "bear"
print(my_animal)[1] "bear"
Code
print(toupper(my_animal))[1] "BEAR"
Code
my_sentence = paste("I", "saw", "a", my_animal)
print(my_sentence)[1] "I saw a bear"
Code
print(paste("----", "++++", sep = ""))[1] "----++++"
Code
# Variables que contienen diferentes tipos de información
# (valores enteros, de cadena, booleanos, etc.)
#
my_data <- list(name = "Joe",
grades = c(8, 7, 9),
has_attended = TRUE)
str(my_data)List of 3
$ name : chr "Joe"
$ grades : num [1:3] 8 7 9
$ has_attended: logi TRUE
Code
str(my_data["name"])List of 1
$ name: chr "Joe"
Code
print(my_data["name"])$name
[1] "Joe"
Code
str(my_data[["name"]]) chr "Joe"
Code
print(my_data[["name"]])[1] "Joe"
Code
str(my_data["grades"])List of 1
$ grades: num [1:3] 8 7 9
Code
str(my_data["has_attended"])List of 1
$ has_attended: logi TRUE
Code
print(my_data[["grades"]])[1] 8 7 9
Code
print(my_data$has_attended)[1] TRUE
Code
# A menudo tenemos más de una observación con diferentes propiedades.
# Por ejemplo, una base de datos de personas con nombres, identificaciones
# únicas, direcciones de correo electrónico, valor del indicador si es un
# nuevo miembro, etc. Y queremos tener una estructura tipo matriz (es decir,
# una tabla) para albergar esos valores.
my_dataset = data.frame(name = c("John", "Sam", "Tim"),
wage = c(800, 600, 700),
is_employed = c(TRUE, TRUE, FALSE),
stringsAsFactors = FALSE)
str(my_dataset)'data.frame': 3 obs. of 3 variables:
$ name : chr "John" "Sam" "Tim"
$ wage : num 800 600 700
$ is_employed: logi TRUE TRUE FALSE
Code
# Tener en cuenta que el stringsAsFactors es necesario para que la columna
# del nombre sea un vector de caracteres en lugar de un factor (un factor
# es un vector de valores enteros con un conjunto correspondiente de valores
# de caracteres para utilizar cuando se muestra el factor).
print(my_dataset) name wage is_employed
1 John 800 TRUE
2 Sam 600 TRUE
3 Tim 700 FALSE
Code
print(my_dataset["name"]) name
1 John
2 Sam
3 Tim
Code
print(my_dataset$is_employed) [1] TRUE TRUE FALSE
Code
# Notar que el uso de $ devuelve un vector, mientras que la especificación
# de ["nombre"] devuelve un data.frame con una columna (como es evidente por
# el formato de salida).
#
# Definición de funciones
#
# Definir una función 1 (una funicón simple que compara dos valores)
my_compare <- function(x, y){
if(x < y){
print("1st value is smaller")
}else{
if(x > y){
print("1st value is greater")
}else{
print("Values are equal")
}
}
}
# Prueba de la función
my_compare(1, 1)[1] "Values are equal"
Code
my_compare(1, 2)[1] "1st value is smaller"
Code
my_compare(2, 1)[1] "1st value is greater"
Code
# Definir una función 2 (una función de suma personalizada, que incrementa
# los valores de dos elementos en uno antes de sumarlos)
my_sum <- function(x, y){
x <- x + 1
y <- y + 1
return(x + y)
}
# Prueba de la función
print(my_sum(1, 2))[1] 5
Code
# Definir una función 3 (resumen de una matriz de datos)
my_summary <- function(x){
min_val = min(x)
max_val = max(x)
sum_val = sum(x)
avg_val = mean(x)
output = list(min = min_val,
max = max_val,
average = avg_val,
sum = sum_val)
return(output)
}
# Prueba de la función
my_results = my_summary(c(-2, 1, 5))
print(my_results$min)[1] -2
Code
print(my_results[["average"]])[1] 1.333333
Code
print(str(my_results))List of 4
$ min : num -2
$ max : num 5
$ average: num 1.33
$ sum : num 4
NULL
Code
print(my_results)$min
[1] -2
$max
[1] 5
$average
[1] 1.333333
$sum
[1] 4
Code
# Listas
#
my_list <- function(a_vec){
a_vec[1] <- "88"
append(a_vec, "!!!")
}
# Prueba de la función
old_vec <- c("a", "b")
cat("Old: ", old_vec, "\n")Old: a b
Code
new_vec <- my_list(old_vec)
cat("New: ", new_vec, "\n")New: 88 b !!!
Code
cat("Old: ", old_vec, "\n")Old: a b
Code
# Creación de matrices
#
# Crearemos una matriz 3X2 con elementos de 1 a 6 por columnas
x1 <- c(1, 2, 3)
x2 <- c(4, 5, 6)
x <- cbind(x1, x2) # los vectores se combinan como columnas en una matriz
print(x) x1 x2
[1,] 1 4
[2,] 2 5
[3,] 3 6
Code
# Podemos transponer una matriz usando t(...)
print(t(x)) [,1] [,2] [,3]
x1 1 2 3
x2 4 5 6
Code
# Podemos acceder a diferentes elementos de la matriz X
print(x[1, ]) # primera fila (para eliminar nombres, usar unname())x1 x2
1 4
Code
print(x[, 1]) # primera columna[1] 1 2 3
Code
print(x[1, 1]) # elemento {1,1}x1
1
Code
print(x[3, 2]) # elemento {3,2}x2
6
Code
# Multiplicar matrices (X'X en este ejemplo)
print(t(x) %*% x) x1 x2
x1 14 32
x2 32 77
Code
# Clases en R
#
# Existen las llamadas clases S3, S4 y Reference en R, aunque su uso
# depende de cada creador de paquetes. Para algunos tutoriales sobre
# la creación de clases en R, ver esta página
# <http://adv-r.had.co.nz/OO-essentials.html> .
# Nos limitaremos a un ejemplo sencillo tanto para R como para Python:
# Una clase tendrá 3 variables: x, y y z;
# Otra clase tendrá una función para imprimir 'hola';
# La siguiente clase tendrá una función para duplicar el valor(es) de y;
# La última clase tendrá una función que incrementa el valor de la variable
# pasada en 1.
# En R, para definir una clase se usa setRefClass. El primer argumento es el
# nombre de la clase, y por convención debe ser el mismo que la variable a la
# que se asigna el resultado.
# También se tienen que pasar listas a los argumentos "fields" y "methods".
MyClass <- setRefClass(
"MyClass",
fields = list(
x = "ANY", #any kind of variable type
y = "numeric", #integer variable type
z = "character"#char variable type
),
methods = list(
initialize = function(x = NULL, y = 1:10, z = letters){
# Notar los valores por defecto para x, y, and z;
# Esta función se usa cuando se crea una instancia de la clase con `$new()`
x <<- x
y <<- y
z <<- z
print("You initialized MyClass!")
},
hello = function(){
# Esta función devuelve la palabra 'hello'.
return("hello")
},
doubleY = function(){
return(2 * y)
},
mySum = function(input){
return(input + 1)
}
)
)
# Crear una nueva instancia de la clase:
my_obj = MyClass$new(x = NULL, y = 1:10, z = c("a", "b", "cd"))[1] "You initialized MyClass!"
Code
print(my_obj)Reference class object of class "MyClass"
Field "x":
NULL
Field "y":
[1] 1 2 3 4 5 6 7 8 9 10
Field "z":
[1] "a" "b" "cd"
Code
# Para acceder a los valores y funciones de los objetos de clase inicializados:
print(my_obj$x) NULL
Code
print(my_obj$y) [1] 1 2 3 4 5 6 7 8 9 10
Code
print(my_obj$z)[1] "a" "b" "cd"
Code
my_obj$hello()[1] "hello"
Code
my_obj$doubleY() [1] 2 4 6 8 10 12 14 16 18 20
Code
my_obj$mySum(5)[1] 6
Code
# Gráficas de datos
#
# Figuras simples
x <- 1:20
y <- 0.5 * x^2 + 2 * x + 3
plot(x, y,
type = "l", lty = 2, col = "blue")
points(x, y, col = "blue", pch = 15)
title(main = "Ejemplo de gráfico")
legend(x = 1, y = 250,
legend = c("Muestra_de_datos_1"),
lty = 2, pch = 15, col = "blue")Code
nsample <- 5000
x_hist <- rnorm(nsample)
hist(x_hist, breaks = 40, col = "lightblue")Code
# Múltiples figuras en una gráfica
# Podemos especificar un diseño de 1 fila y 2 columnas utilizando
# par(mfrow = c(1, 2))
par(mfrow = c(1, 2))
plot(x, y, type = "l", col = "blue")
plot(x, rev(y), type = "l", col = "red")Code
# También se pueden representar un número impar de figuras en una gráfica
# Utilizando la función layout podemos especificar un diseño de matriz de
# cómo queremos que se posicionen nuestras figuras, donde el número indica
# el número de parcela - cuanto más grande sea la matriz, más preciso puede
# ser nuestro posicionamiento; un 0 indica que no hay que trazar en esa
# posición.
my_matrix = matrix(c(1, 1,
2, 3), nrow = 2, ncol = 2, byrow = TRUE)
layout(my_matrix)
plot(x, y, type = "l", col = "blue", lwd = 2)
hist(x_hist, breaks = 40, col = "lightblue")
hist(x_hist, breaks = 40, col = "lightgreen")Code
# Librería gráfica más usada actualmente
library(ggplot2)
data <- data.frame(x, y)
p <- ggplot(data, aes(x = x, y = y))
p <- p + geom_line(col = "red") + geom_point(col = "darkgreen")
pCode
# Ayuda
#
# Información sobre un comando: print
# help(print)
#
# Matrices de datos
#
# Crear una lista
my_vec = [1, 2, 3, 4, 5, 6, 7, 8]
print(type(my_vec))<class 'list'>
Code
# Seleccionar datos (en Python los valores comienzan en el índice 0)
print(my_vec[0])1
Code
print(my_vec[0:3]) # En Python el rango 0:3 = {0, 1, 2} t, por tanto,[1, 2, 3]
Code
# no se incluye el último valor
print([my_vec[i] for i in [0, 1, 3, 7]])[1, 2, 4, 8]
Code
my_range = list(range(1, 5))
print(my_range)[1, 2, 3, 4]
Code
print(my_range[1:4])[2, 3, 4]
Code
# Longitud del vector
print(len(my_vec))8
Code
# Bucles
for i in range(0, len(my_vec)):
print(my_vec[i])1
2
3
4
5
6
7
8
Code
# Seleccionar cada tercer elemento, empezando desde el segundo
print(my_vec[1::3])[2, 5, 8]
Code
# o cada segundo elemento partiendo desde el primero
print(my_vec[0::2])[1, 3, 5, 7]
Code
# Suma de vectores
my_vec_1 = list(range(1, 6))
my_vec_2 = my_vec_1[::-1]
print("vec. 1: ", my_vec_1)vec. 1: [1, 2, 3, 4, 5]
Code
print("vec. 2: ", my_vec_2)vec. 2: [5, 4, 3, 2, 1]
Code
vec_sum = [a + b for a, b in zip(my_vec_1, my_vec_2)]
print("vec. 1 + 2: ", vec_sum)vec. 1 + 2: [6, 6, 6, 6, 6]
Code
print(list(zip(my_vec_1, my_vec_2)))[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]
Code
print("vec. 1 & 2: ", my_vec_1 + my_vec_2)vec. 1 & 2: [1, 2, 3, 4, 5, 5, 4, 3, 2, 1]
Code
# Si usamos numpy.array en lugar de una lista, entonces podemos sumar
# los dos vectores en Python como lo hacemos en R
import numpy as np
my_vec_1_np = np.array(my_vec_1)
np_vec_2_np = np.array(my_vec_2)
print("vec. 1 + 2: ", my_vec_1_np + np_vec_2_np)vec. 1 + 2: [6 6 6 6 6]
Code
# Multiplicar los elementos de un vector por una constante
print([x * 3 for x in my_vec_1])[3, 6, 9, 12, 15]
Code
# Para una lista en Python, el signo * tiene un significado diferente
print(my_vec_1 * 3)[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
Code
# Si utilizamos numpy.array, el funcionamiento es similar al de R
import numpy as np
my_vec_1_np = np.array(my_vec_1)
print(my_vec_1_np * 3)[ 3 6 9 12 15]
Code
# Cadenas de caracteres
#
# Python tiene estos módulos implementados en la propia clase string,
# por lo que siempre sabremos qué funciones están disponibles utilizando
# el operador punto . y pulsando Tab en el editor para obtener la lista
# completa de módulos de una clase concreta
my_animal = "bear"
print(my_animal)bear
Code
print(my_animal.upper())BEAR
Code
my_sentence = "I " + "saw a " + my_animal
print(my_sentence)I saw a bear
Code
print("----" + "++++")----++++
Code
# Variables que contienen diferentes tipos de información
# (valores enteros, de cadena, booleanos, etc.)
#
my_data = {"name": "Joe",
"grades": [8, 7, 9],
"has_attended": True}
print(type(my_data))<class 'dict'>
Code
print(my_data){'name': 'Joe', 'grades': [8, 7, 9], 'has_attended': True}
Code
print(type(my_data["name"]))<class 'str'>
Code
print(my_data["name"])Joe
Code
print(type(my_data["grades"]))<class 'list'>
Code
print(type(my_data["has_attended"]))<class 'bool'>
Code
print(my_data["grades"])[8, 7, 9]
Code
print(my_data["has_attended"])True
Code
# A menudo tenemos más de una observación con diferentes propiedades
# (por ejemplo, una base de datos de personas con nombres,
# identificaciones únicas, direcciones de correo electrónico, valor
# del indicador si es un nuevo miembro, etc.) y queremos tener una
# estructura tipo matriz (es decir, una tabla) para albergar esos valores.
import pandas as pd
my_dataset = {"name": ["John", "Sam", "Tim"],
"wage": [800, 600, 700],
"is_employed": [True, True, False]}
my_dataset = pd.DataFrame(my_dataset, columns = my_dataset.keys())
# La opción columns = my_dataset.keys() es necesaria para preservar
# el orden de las columnas
print(type(my_dataset))<class 'pandas.core.frame.DataFrame'>
Code
print(my_dataset) name wage is_employed
0 John 800 True
1 Sam 600 True
2 Tim 700 False
Code
print(my_dataset.keys()) Index(['name', 'wage', 'is_employed'], dtype='object')
Code
print(my_dataset["name"])0 John
1 Sam
2 Tim
Name: name, dtype: object
Code
print(my_dataset["is_employed"])0 True
1 True
2 False
Name: is_employed, dtype: bool
Code
# Definición de funciones
#
# Definir una función 1
def my_compare(x, y):
if x < y:
print("1st value is smaller")
elif x > y:
print("1st value is greater")
else:
print("Values are equal")
# Prueba de la función
my_compare(1, 1)Values are equal
Code
my_compare(1, 2)1st value is smaller
Code
my_compare(2, 1)1st value is greater
Code
# Definir una función 2
def my_sum(x, y):
x = x + 1
y = y + 1
return x + y
# Prueba de la función
print(my_sum(1, 2))5
Code
# Definir una función 3
import numpy as np
def my_summary(x):
min_val = min(x)
max_val = max(x)
sum_val = sum(x)
avg_val = np.mean(x)
output = {"min": min_val,
"max": max_val,
"average": avg_val,
"sum": sum_val}
return output
# Prueba de la función
my_results = my_summary([-2, 1, 5])
print(my_results["min"])-2
Code
print(my_results["average"])1.3333333333333333
Code
print(type(my_results))<class 'dict'>
Code
print(my_results){'min': -2, 'max': 5, 'average': 1.3333333333333333, 'sum': 4}
Code
# Listas en Python (son mutables)
#
def my_list(a_list):
a_list[0] = "88"
a_list.append("!!!")
return a_list
# Prueba de la función
old_list = ["a", "b"]
print("Old: " + str(old_list))Old: ['a', 'b']
Code
new_list = my_list(old_list)
print("New: " + str(new_list))New: ['88', 'b', '!!!']
Code
print("Old: " + str(old_list)) Old: ['88', 'b', '!!!']
Code
# Los valores originales fueron cambiados en Python, ¡aunque asignamos
# la salida de la función a una nueva variable!
# Para no modificar el objeto que estamos pasando, podemos crear una
# nueva referencia dentro de nuestra función
def my_list(a_list):
# Crear una nueva referencia
# Método 1
# b_list = a_list[:]
# Método 2
b_list = list(a_list)
# Modificar los valores
b_list[0] = "88"
b_list.append("!!!")
return b_list
# Prueba de la función
old_list = ["a", "b"]
print("Old: " + str(old_list))Old: ['a', 'b']
Code
new_list = my_list(old_list)
print("Old: " + str(old_list))Old: ['a', 'b']
Code
print("New: " + str(new_list))New: ['88', 'b', '!!!']
Code
# Tener en cuenta que si escribimos b_list = a_list en lugar de
# b_list = a_list[:] (o en lugar de b_list = list(a_list)),
# ¡volveremos a modificar la variable original!
#
# Creación de matrices
#
# Crearemos una matriz 3X2 con elementos de 1 a 6 por columnas
import numpy as np
#
x1 = [1, 2, 3]
x2 = [4, 5, 6]
x_cs = np.column_stack((x1, x2))
x_vs = np.vstack((x1, x2))
# Una matriz bidimensional - cada elemento es un par de listas diferentes
print(x_cs)[[1 4]
[2 5]
[3 6]]
Code
# Una matriz bidimensional - cada elemento es una lista completa
print(x_vs) [[1 2 3]
[4 5 6]]
Code
# Podemos transponer una matriz usando np.transpose(...)
print("Column-stacked lists:\n", x_cs)Column-stacked lists:
[[1 4]
[2 5]
[3 6]]
Code
print("Transposed row-stacked lists:\n", np.transpose(x_vs))Transposed row-stacked lists:
[[1 4]
[2 5]
[3 6]]
Code
print("Row-stacked lists:\n", x_vs)Row-stacked lists:
[[1 2 3]
[4 5 6]]
Code
print("Transposed column-stacked lists:\n", np.transpose(x_cs))Transposed column-stacked lists:
[[1 2 3]
[4 5 6]]
Code
# Podemos acceder a diferentes elementos de la matriz X
print("Column-stacked lists:")Column-stacked lists:
Code
print(x_cs[0]) # Primera fila[1 4]
Code
print(np.transpose(x_cs)[0]) # Primera columna[1 2 3]
Code
print(x_cs[0][0]) # Elemento X_{1,1}1
Code
print(x_cs[2][1]) # Elmentos X_{3,2}6
Code
print("Row-stacked lists:")Row-stacked lists:
Code
print(np.transpose(x_vs)[0]) # Primera fila[1 4]
Code
print(x_vs[0]) # Primera columna[1 2 3]
Code
print(x_vs[0][0]) # Elemento X_{1,1}1
Code
print(x_vs[1][2]) # Elemento X_{3,2}6
Code
# Multiplicar matrices (X'X en este ejemplo)
print(np.dot(np.transpose(x_cs), x_cs))[[14 32]
[32 77]]
Code
print(np.dot(x_vs, np.transpose(x_vs)))[[14 32]
[32 77]]
Code
# Clases en Python
#
# El __init__ es un método que establece los valores para cualquier
# parámetro que necesite ser definido cuando un objeto de esta clase
# es creado por primera vez. La parte self. es una sintaxis que
# permite acceder a una variable desde cualquier otra parte de la clase.
import numpy as np
import string
class MyClass():
def __init__(self, x = None, y = None, z = None):
# Este método se usa cuando se crea una instancia de la clase
# Especifica los valores por defecto
if y is None:
y = list(range(1, 11))
if z is None:
z = string.ascii_lowercase #alphabet letters
self.y = y
self.x = x
self.z = z
print("You initialized MyClass!")
# Como los métodos de clase no son funciones, necesitan un parámetro `self`
def hello(self):
return "hello"
def doubleY(self):
return 2 * np.array(self.y)
def mySum(self, my_input):
return np.array(my_input) + 1
# Crear una nueva instancia de la clase:
my_obj = MyClass(x = None, y = list(range(1, 11)), z = ["a", "b", "cd"])You initialized MyClass!
Code
# Para acceder a los valores y funciones de los objetos de clase inicializados
print(my_obj)<__main__.MyClass object at 0x7f571cce3760>
Code
print(my_obj.x)None
Code
print(my_obj.y)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Code
print(my_obj.z)['a', 'b', 'cd']
Code
print(my_obj.hello())hello
Code
print(my_obj.doubleY())[ 2 4 6 8 10 12 14 16 18 20]
Code
print(my_obj.mySum(5))6
Code
# Gráficas de datos
#
# Gráficas simples
import matplotlib.pyplot as plt
x = list(range(1, 21))
y = [0.5 * a**2 + 2 * a + 3 for a in x]
plt.figure(0)
plt.plot(x, y,
linestyle = "--", color = "blue",
marker = "s", # squares (cuadrados)
label = "Muestra_de_datos_1")
plt.title("Ejemplo de gráfico")
plt.legend(loc = "upper left")
plt.show()Code
nsample = 5000
x_hist = np.random.normal(size = nsample)
plt.figure(1)
tmp_hist_ret = plt.hist(x_hist, bins = 40,
color = "limegreen", edgecolor = "black")
plt.show()Code
# Múltiples figuras
# Podemos especificar la disposición de 1 fila y 2 columnas utilizando
# add_subplot(1, 2, c) o add_subplot(12c) donde c es la posición
# (número entero) del trazado (c = 1 - trazado en el primer espacio
# de disposición, c = 2 - trazado en el segundo espacio de disposición).
y2 = y[::-1]
_ = plt.figure(2).add_subplot(121)
_ = plt.plot(x, y, color = "blue")
_ = plt.figure(2).add_subplot(122)
_ = plt.plot(x, y2, color = "red")
plt.show()Code
# Para representar múltiples figuras
# Utilizando add_subplot(abc) podemos especificar un número par o impar
# de figuras especificando un diseño de subplot diferente (por ejemplo,
# el mismo número de filas pero diferentes columnas) para algunas de las
# parcelas, ¡pero sus posiciones no deben solaparse!
_ = plt.figure(3).add_subplot(211)
_ = plt.plot(x, y, color = "blue")
_ = plt.figure(3).add_subplot(223)
tmp_hist_ret = plt.hist(x_hist, color = "darkcyan",
bins = 40, edgecolor = "black")
_ = plt.figure(3).add_subplot(224)
tmp_hist_ret = plt.hist(x_hist, color = "limegreen",
bins = 40, edgecolor = "black")
plt.show()Code
# Librerías gráficas avanzadas
#
from plotnine import *
data = pd.DataFrame(data = {"x": x, "y": y})
p = ggplot(data, aes(x = 'x', y = 'y'))
p = p + geom_line(color = "red") + geom_point(color = "darkgreen")
print(p)