私は3つのデータ列を持っています:2つの位置値と1つのデータ値。このデータをピボットして、ある列の要素が新しい列になり、元の列の別の要素がインデックスになるようにしたいと思います。これらのデータは、pcolormesh
を使用してプロットされます。 pcolormesh
は、データが何をすべきかを推測する必要がないように構造化されることを期待しています。つまり、列がある場合、pcolormesh
はこの列に正しく記入されません。だから、データを正しく整形してpcolormesh
に送ることができるようにコードを書いています。python pandas reindexingは0.0でデータを削除します
問題は、コードがx = 0.0
周辺のデータを削除しているようです。私はこれが、データフレームが「欠けている」行を含むように再索引付けされている行で発生していると思います。
問題文に視覚的な助言を与えるためにプロット(したがっていくつかの余分なコード)を追加しました。左のプロットは元のデータを示し、右のプロットはデータがpcolormesh
のために再形成された後の結果を示しています。
私が提供したコード例は、ipythonノートブックでのみコピーして貼り付けて実行する必要があります。
ご提案は大歓迎です。おそらく、この解決策は非常に複雑ですか?それは確かにそう感じる。
%matplotlib inline
import decimal
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
test_df = pd.DataFrame()
test_df['x'] = [-2, -1.5, -0.9, -0.7, -0.5, 0.0, 0.5, 1.1]
test_df['y'] = [1,2,4,5,6,7,5,4]
test_df['v'] = np.random.randn(8)
def get_precision(number):
"""
gives the precision, or decimal place, of the number
http://stackoverflow.com/questions/6189956/easy-way-of-finding-decimal-places
"""
return int(abs(decimal.Decimal(str(number)).as_tuple().exponent))
def min_max(column):
column_min = np.floor(column.min())
column_max = np.ceil(column.max())
return column_min, column_max
def construct_df_for_pcolormesh(df, col, ix, values, columns_increment, index_increment):
columns_increment = 1.0/columns_increment
index_increment = 1.0/index_increment
columns_precision = get_precision(columns_increment)
index_precision = get_precision(index_increment)
columns_min, columns_max = min_max(df[col])
index_min, index_max = min_max(df[ix])
columns = np.linspace(columns_min, columns_max, (columns_max - columns_min)*columns_increment + 1)
index = np.linspace(index_min, index_max, (index_max - index_min)*index_increment + 1)
new_index = [(round(c, columns_precision), round(i, index_precision)) for c in columns for i in index]
df_for_pcolormesh = df.set_index([col, ix]).reindex(new_index).reset_index()
df_for_pcolormesh = df_for_pcolormesh.pivot(index=ix, columns=col, values=values)
return df_for_pcolormesh
fig, (ax,ax1)= plt.subplots(1,2, sharey=True, sharex=True)
test_df.plot(kind='scatter', x='x', y='y', s=100, grid=True, ax=ax)
ax.set_ylim(0,8)
ax.set_xlim(-2.5, 1.5)
ax.set_title('Plot with all the data')
data_df = construct_df_for_pcolormesh(test_df, 'x', 'y', 'v', 0.1, 0.1)
depths = data_df.index
xx = data_df.columns
d, x = np.meshgrid(depths, xx)
data = np.ma.masked_invalid(data_df.values)
ax1.pcolormesh(x, d, data.transpose(), cmap='viridis')
ax1.grid(True)
ax1.set_ylim(0,8)
ax1.set_xlim(-2.5, 1.5)
ax1.set_title('Plot with missing\ndatapoint at x=0.0')
一般的に、あなたの質問に、最小限の例を持っていると思います。あなたにはたくさんのコードが含まれています。値を失う原因となるコードだけを残して、いくつかの本質的なものを削除できますか? – dbliss