Happy Fibonacci Day!
J, 58 bytes
3 :''' i_''{~|.|:(,|.)(#&1,2#~0&=)"*}.,0,.(%-.-*:)t.1+i.y'
Uses (%-.-*:)t.
for Fibonacci generation. Explanation might come a bit later.
Usage:
f=.3 :''' i_''{~|.|:(,|.)(#&1,2#~0&=)"*}.,0,.(%-.-*:)t.1+i.y'
f 5
ii
ii
i ii i
i i ii i i
i_i_i_i_ii_i_i_i_i
Try it online here.
CJam, 41 39 bytes
"i""_"1$ri({1$1$4$+}*]),f{Se[}W<_W%+zN*
This prints a fair amount of leading whitespace. Try it online in the CJam interpreter.
How it works
"i""_"1$ e# Push "i", "_", and a copy of "i".
ri( e# Read an integer from STDIN and subtract 1.
{ e# Do that many times:
1$ e# Copy the last underscore.
1$4$+ e# Copy the last strings of i's and concatenate them.
}* e#
]), e# Wrap the results in an array, pop the last string, and get its length.
f{ e# For each remaining string, push the string and the length; then:
Se[ e# Pad the string to that length by prepending spaces.
}
W< e# Remove the last string (underscore).
e# We have now generated the columns of the left half of the output.
_W%+ e# Append a reversed copy (columns of right half).
z e# Transpose rows with columns.
N* e# Separate the rows by linefeeds.
TeaScript, 93 84 76 + 1 = 77 bytes
+1 byte for "Inputs are numbers?" checkbox
r×ß(p.R((w=F(x©-F(i¬©+"i"R(F(i¬±)t¡ß(j=i<w-1?" ":"_",(A=l¿i>0?j+l:l)µ)+Av©j§
Ungolfed version:
r(x)m(#(p.R((w=F(x))-F(i+1))+"i"R(F(i+1))))t()m(#(j=i<w-1?" ":"_",(A=ls``.m(#i>0?j+l:l)j``)+Av))j`
`
Thanks to @Vɪʜᴀɴ for the tips.