• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

378
Views
Trazado de la región de incertidumbre sombreada en un gráfico de líneas en matplotlib cuando los datos tienen NaN

Me gustaría una trama que se vea así: parcela con incertidumbre

Estoy tratando de hacer esto con matplotlib:

 fig, ax = plt.subplots() with sns.axes_style("darkgrid"): for i in range(5): ax.plot(means.ix[i][list(range(3,104))], label=means.ix[i]["label"]) ax.fill_between(means.ix[i][list(range(3,104))]-stds.ix[i][list(range(3,104))], means.ix[i][list(range(3,104))]+stds.ix[i][list(range(3,104))]) ax.legend()

Quiero que la región sombreada sea del mismo color que la línea del centro. Pero en este momento, mi problema es que means que tiene algunos NaN y fill_between no lo acepta. me sale el error

TypeError: ufunc 'isfinite' no es compatible con los tipos de entrada, y las entradas no se pueden coaccionar de forma segura a ningún tipo compatible de acuerdo con la regla de conversión "segura".

¿Alguna idea sobre cómo podría lograr lo que quiero? La solución no necesita usar matplotlib siempre que pueda trazar mi serie de puntos con sus incertidumbres para series múltiples.

about 3 years ago · Santiago Trujillo
2 answers
Answer question

0

Está bien. Así que uno de los problemas era que el dtype de mis datos era object y no float y esto causó que fill_between fallara cuando miraba para ver si los números eran finitos. Finalmente logré hacerlo (a) convirtiéndolo en float y luego (b) resolviendo el problema de los colores coincidentes para la incertidumbre y la línea, para usar una paleta de colores. Así que tengo:

 import seaborn as sns import numpy as np import matplotlib.pyplot as plt import pandas as pd fig, ax = plt.subplots() clrs = sns.color_palette("husl", 5) with sns.axes_style("darkgrid"): epochs = list(range(101)) for i in range(5): meanst = np.array(means.ix[i].values[3:-1], dtype=np.float64) sdt = np.array(stds.ix[i].values[3:-1], dtype=np.float64) ax.plot(epochs, meanst, label=means.ix[i]["label"], c=clrs[i]) ax.fill_between(epochs, meanst-sdt, meanst+sdt ,alpha=0.3, facecolor=clrs[i]) ax.legend() ax.set_yscale('log')

lo que me dio el siguiente resultado: ingrese la descripción de la imagen aquí

about 3 years ago · Santiago Trujillo Report

0

¿Podría simplemente eliminar los NaNs de su marco de datos de means y trazar ese marco de datos resultante en su lugar?

En el siguiente ejemplo, traté de acercarme a su estructura, tengo un DataFrame de means con algo de NaN esparcido. Supongo que stds DataFrame probablemente tenga NaN en las mismas ubicaciones, pero en este caso realmente no importa, dejo caer NaN de los means para obtener temp_means y uso los índices que quedan en temp_means para extraer los valores estándar de stds .

Los gráficos muestran los resultados antes (arriba) y después (abajo) de dejar caer los NaN s

 x = np.linspace(0, 30, 100) y = np.sin(x/6*np.pi) error = 0.2 means = pd.DataFrame(np.array([x,y]).T,columns=['time','mean']) stds = pd.DataFrame(np.zeros(y.shape)+error) #sprinkle some NaN in the mean sprinkles = means.sample(10).index means.loc[sprinkles] = np.NaN fig, axs = plt.subplots(2,1) axs[0].plot(means.ix[:,0], means.ix[:,1]) axs[0].fill_between(means.ix[:,0], means.ix[:,1]-stds.ix[:,0], means.ix[:,1]+stds.ix[:,0]) temp_means = means.dropna() axs[1].plot(temp_means.ix[:,0], temp_means.ix[:,1]) axs[1].fill_between(temp_means.ix[:,0], temp_means.ix[:,1]-stds.loc[temp_means.index,0], temp_means.ix[:,1]+stds.loc[temp_means.index,0]) plt.show()

ingrese la descripción de la imagen aquí

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error